1、反射
在編譯時,不確定哪個類被加載,而在程序運行時才加載,探知,使用
反射案例:不知道類加載進去是什麼,加載進去後,採取探知,屬性、方法、類
Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。
2、反射的用處:
javaweb框架,省略代碼,運行時檢查程序員輸入的內容、根據輸入的內容取探知屬性、方法
3、創建Class(類類型)對象
方法一:Class cla=Class.forName("包名+類名(全路徑)");
eg:Class dateclass_2=Class.forName("java.util.Date");
方法二:Class cla=實例.getclass(參數);//參數爲一個對象
方法三:Class cla=類.class;
eg:Class dateclass_1=Date.class;
System.out.println(dateclass_1);//class java.util.Date
Date d1=(Date) dateclass_1.newInstance();//new一個Date的實例
4、獲取屬性
eg:Field fieldName=studentClass.getDeclaredField("name");//獲取屬性 name
System.out.println("獲得的屬性:"+fieldName);//獲得的屬性:private java.lang.String reflect_1.Student.name
Student s=new Student();//new一個Student對象
System.out.println(s.getName());//null
fieldName.setAccessible(true);//賦予設置的權限(原屬性爲private)
fieldName.set(s, "小明");//給對象s設置name“小明”
System.out.println(s.getName());//小明
Field[] sf=studentClass.getDeclaredFields();//獲得Student中的全部屬性 Field[]
for (Field f:sf) {//增強型for循環遍歷Field[],輸出屬性的名字
System.out.println("Student中的屬性:"+f.getName());
}
5、獲取方法
eg:Class<Student> c = Student.class;//創建類類型
Method m2 = c.getDeclaredMethod("setName", String.class);//獲得方法 寫方法參數的類類型String.class
Student s = new Student();//實例化一個新對象s
m2.invoke(s, "小紅");//調用S的setName方法 invoke 調用
Method[] ms = c.getDeclaredMethods();//獲取所有的方法
for (Method m : ms) {//增強型for遍歷Method數組,輸出方法名
System.out.println("Student的方法:" + m.getName());
}
6、獲取構造方法
eg:Class<Student> c=Student.class;
Constructor<Student> sm=c.getConstructor(int.class,String.class,String.class);
sm.newInstance(12,"小敏","男");
7、AOP—面向切面的編程(Aspect Oriented Programming)
動態的加入和刪除在切面上的邏輯,而不去修改源碼
切面要實現一個接口 InvocationHandler
屬性爲被代理的對象---private Object target;
重寫invoke方法:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
beforeMethod();
method.invoke(target, args);
afterMethod();
return null;
}
測試類:
UserDAO us = new UserDAOImp();
logInterceptor l = new logInterceptor(us);//切面
//生成代理對象
// 參數 :1-類加載器;2-類的接口;3-切面
UserDAO us2 = (UserDAO) Proxy.newProxyInstance(us.getClass().getClassLoader(),
us.getClass().getInterfaces(),l);
作用:方法前後加入日誌;計時;操作權限
8、內部類
類內部再定義一個類;他能訪問外部類的所有數據,包括private的.
a、成員式內部類:
eg:Outer.Inter x=new Outer().new Inter();//內部類不加static,new一個對象
Outer.Inter x=new Outer.Inter();//內部類加了static,new一個對象
b、內部類,外部類的方法和屬性不能互相調用
c、匿名內部類:只有一個實例,而且沒有引用
9、配置文件—json xml properties
a、json---JavaScript Object Notation 對象簡譜
鍵:值 --- 對的形式
步驟:1、導包 gson.jar
2、寫一個json 對象
JsonObject jb=new JsonObject();//new一個json對象
//寫到 demo.json文件
PrintWriter pw=new PrintWriter(new FileOutputStream("demo.json"));
jb.addProperty("cn", "中國");
pw.write(jb.toString());
3、Jsonarray Json數組
eg:JsonArray ja=new JsonArray();//new一個Json數組
ja.add(jb);//數組裏添加Json對象
4、寫入對象
eg:pw.write(new Gson().toJson(map));//要用new Gson().toJson(要寫的對象列表);
5、讀取
eg://讀取
JsonObject jo =(JsonObject) jp.parse(new FileReader("demo.json"));
jo.get("aaa");
eg://讀取寫入gson的list
JsonArray ja=(JsonArray) jp.parse(new FileReader("demo.json"));
Person[] ps= new Gson().fromJson(ja.toString(), Person[].class);
for (Person p:ps) {
System.out.println(p.toString());
}
b、Xml 的讀取
XML的解析方式分爲四種:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。
eg://1-獲取工具 SAXreader
SAXReader reader=new SAXReader();
//2-將xml轉換成document文檔
Document doc=reader.read("demo.xml");
//3-生成根節點
Element eles=doc.getRootElement();
//4-遍歷rootElement
Iterator<Element> it=eles.elementIterator();
c、properties 讀取 鍵=值
eg://初始化工具類
Properties p=new Properties();
//讀取文件
BufferedReader br=new BufferedReader(new FileReader("demo.properties"));
//加載流
p.load(br);
//讀取
Set<String> itSet= p.stringPropertyNames();
Iterator<String> it=itSet.iterator();
while (it.hasNext()) {
String key=it.next();
System.out.println("key="+key+"---"+"value="+p.getProperty(key));
}