JAVA_SE基礎知識——反射、內部類、配置文件(json,xml,properties)

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));
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章