天天看點

如何一個動态建立對象?

反射八:動态建立對象(Java)

1、獲得Class對象
2、構造一個對象
3、通過構造器建立對象
4、通過反射調用普通方法
5、通過反射調用方法
6、通過方式操作屬性      
package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//動态的建立對象,通過反射
public class Test09 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //獲得Class對象
        Class c1 = Class.forName("reflect.User");

        //構造一個對象
        User user =(User)c1.newInstance();//本質是調用了類的無參構造器
        System.out.println(user);//User{name='null', id=0, age=0}
        System.out.println("================================");
        
        //通過構造器建立對象
        Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
        User user2 =(User)constructor.newInstance("花花", 007, 19);
        System.out.println(user2); //User{name='花花', id=7, age=19}
        //将User删除,也可以建構
        System.out.println("================================");
        //通過反射調用普通方法
        User user3 =(User)c1.newInstance();
        //通過反射調用方法
        //invoke激活 執行的意思
        //(對象,“方法的值”)
        Method setName = c1.getDeclaredMethod("setName", String.class);
        setName.invoke(user3,"花花");
        System.out.println(user3.getName());

        //通過方式操作屬性
        System.out.println("================================");
        User user4 =(User)c1.newInstance();
        Field name = c1.getDeclaredField("name");
        //不能直接操作私有屬性,需要關閉程式的安全檢測,屬性或方法的setAccessible(true)
        name.setAccessible(true);//關閉
        name.set(user4,"花花007");
        System.out.println(user4.getName());
    }
}