天天看點

認識JAVA反射機制認識JAVA反射機制

認識JAVA反射機制

定義

​ JAVA反射機制是在運作狀态中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為java語言的反射機制。

Java****反射機制,可以實作以下功能:

①在運作時判斷任意一個對象所屬的類;

②在運作時構造任意一個類的對象;

③在運作時判斷任意一個類所具有的成員變量和方法;

④在運作時調用任意一個對象的方法;

⑤生成動态代理。

擷取Class對象

public class Source { 
	public static void main(String[] args) {
        //第一種方式:對象.class 
        Source s=new Source(); 
        Class<?>c1=s.getClass(); 
        //第二種方式:類.class 
        Class<?>c2=Source.class; 
        //第三種方式(推薦方式):
        Class.forName(包名.類名)
            Class<?>c3=null;
        try{
            c3=Class.forName("com.llllt.ref.simple.Source"); 			} catch (ClassNotFoundException e) 
        	{ e.printStackTrace(); 						}System.out.println(c1.getName()); System.out.println(c2.getName()); System.out.println(c3.getName()); } }
           

擷取完class對象之後就可以擷取一系列東西

擷取構造器

public class ReflectDemo {
    public static void main(String[] args) throws Exception  	{
        testConstructor(User.class);
    }

    public static void testConstructor(Class cls) throws Exception {
        Constructor con=cls.getConstructor(String.class,int.class);
        System.out.println(con);

        //擷取所有構造器
        Constructor[] cons = cls.getDeclaredConstructors();
        for(Constructor c:cons) {
            System.out.println(c);
        }

        //建立對象
        User user1= (User) cls.newInstance();
        System.out.println(user1);

        //使用私有構造器初始化
        cons[1].setAccessible(true);
        User user2= (User) cons[1].newInstance("song");
        cons[1].setAccessible(false);
        System.out.println(user2);
    }
    }

           

擷取方法與調用方法

public static void methodtest(Class cls) throws Exception {
        //擷取方法
        Method[] methods = cls.getDeclaredMethods();
        System.out.println(Arrays.toString(methods));

        User user = (User) cls.newInstance();

        Method method2 = cls.getMethod("setAge",int.class);
        System.out.println(method2);

        //調用方法
        method2.invoke(user,10);
        System.out.println(user);
        //成員
        //靜态
    }
           

設定屬性

public static void filedtest(Class<User> cls) throws Exception {
        Field field = cls.getDeclaredField("name");
        System.out.println(field);

        User user = cls.newInstance();

        field.setAccessible(true);
        field.set(user,"宋芳強");
        System.out.println(user);
        //field.setAccessible(false);
        //System.out.println(field.get(user));
    }