JAVA連載117-反射的應用與打破封裝新

1、反射的概念java

1.反射的概念是有Smith在1982年首次提出,主要是指程序能夠訪問、檢測和修改它自己狀態或者行爲的一種能力,而且根據自身行爲的狀態和結果,調整或者修改應用所描述行爲的狀態和相關的語義。node

2.Java中,反射是一種強大的工具,它使您可以建立靈活的代碼,這些代碼能夠在運行時進行裝配,無需在組件中進行源代碼的連接。git

3.反射容許咱們在編寫與執行的時候,使咱們的代碼可以裝載到JVM中的類的內部信息,而不是源代碼中選定的類協做的代碼,這使得放射成爲構建靈活的應用的主要工具,可是須要主要注意的是,若是使用不當,會形成不可預知的結果。​github

 

package com.bjpowernode.java_learning;

import java.util.Properties;

import java.io.*;

import java.util.*;

import java.io.FileReader;

//import com.bjpowernode.java_learning.classInfo.properties;
public class D116_2_ClassInfo {

  public static void main(String[] args) throws Exception{

    //1.建立屬性對象

    Properties p = new Properties();

    //2.建立流

    String address = "C:\\Users\\lenovo1\\Workspaces\\MyEclipse CI\\Java_learning\\src\\com\\bjpowernode\\java_learning\\classInfo.properties";

    FileReader fr = new FileReader(address);

    //3.加載

    p.load(fr);

    //4.關閉流

    fr.close();

    //經過key獲取value

    String className = p.getProperty("className");

    System.out.println(className);

    //經過反射機制建立對象

    Class c = Class.forName(className);

    //建立對象

    Object o = c.newInstance();

    System.out.println(o);

   

    //這種方式與咱們直接new一個對象有什麼優點

    //這種方式咱們能夠在外面設置properties屬性文件來達到修改建立對象的方式

  }

}

2、獲取某個指定的屬性,而且能夠打破封裝性安全

 

package com.bjpowernode.java_learning;

import java.lang.reflect.*;

​

public class D117_2_Reflect {

  public static void main(String[] args) throws Exception{

    //獲取一個類

    Class c = Class.forName("com.bjpowernode.java_learning.D117_1_Reflect");

    //獲取id屬性

    Field idF = c.getDeclaredField("id");

//    System.out.println(idF);

   

    //獲取到某個特定的屬性?set,get

    Object o = c.newInstance();

   

    //由於id是private,因此須要打破封裝,下面這個方法能夠打破權限

    idF.setAccessible(true);

    //使用反射機制能夠打破java程序的封裝性,致使了Java對象的屬性變得不安全了

   

    //set方法,void idF.set(Object obj,Object value);

    idF.set(o, "004512");//給對象o的idF屬性賦上「004512」這個值

   

   

  }

}

 

3、源碼:微信

D117_1_Reflect.java工具

D117_2_Reflect.java學習

https://github.com/ruigege66/Java/blob/master/D117_1_Reflect.java大數據

https://github.com/ruigege66/Java/blob/master/D117_2_Reflect.javaui

2.CSDN:https://blog.csdn.net/weixin_44630050

3.博客園:https://www.cnblogs.com/ruigege0000/

4.歡迎關注微信公衆號:傅里葉變換,我的公衆號,僅用於學習交流,後臺回覆」禮包「,獲取大數據學習資料

 

相關文章
相關標籤/搜索