Java基础-利用反射动态创建对象

Java基础-利用反射动态创建对象

1.反射概念

​ JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

图解:
Java基础-利用反射动态创建对象_第1张图片

2.反射功能
  • 三种方式获取Class对象
	@Test//获取Class --范围:所有的字节码文件
    public void test1() throws ClassNotFoundException {
        //方式1--通过类名
        Class c=Dog.class;//Dog.java编译后的字节码文件
        Class c1=Book.class;//Book.java编译后的字节码文件
        //方式2--通过对象
        Class c3 = new Dog().getClass();
        //方式3--通过类路径
        Class c4 = Class.forName("reflect1.Book");
    }
  • 使用方法:
无参创建对象:
	//1.获取到某个类的字节码文件对象,即Class的对象
	Class<Dog> c = Dog.class;
	//2.帮Dog调用无参构造
	Dog dog = c.newInstance();
	
有参构造器创建对象:
	//1.获取到某个类的字节码文件对象,即Class的对象
	Class<Dog> c = Dog.class;
	//2.获取有参构造的管理对象--2个参数的那个 getConstructor(构造器的参数类型.class) //得到设定构造器
	Constructor<Dog> con = c.getDeclaredConstructor(String.class,int.class);
	//3.帮助Dog类调用有参构造
	con.setAccessible(true) //确认获得私有
	Dog dog = con.newInstance("旺财",2);   

调用属性:
	field=c.getDeclaredField(属性名) //获得类中的属性管理对象
	   field.setAccessible(true) //确认获得私有
	   field.set(dog,修改属性值)

调用方法: 
	mothed=c.getDeclaredMothed(方法名,参数类型.class)//获得类方法管理对象
         mothed.setAccessible(true) //确认获得私有
         mothed.invoke(dog,"参数值");//调用方法

案例:利用反射创建一个对象

Dog类:

public class Dog {
    private String name;
    private int age;

    public Dog() {
        System.out.println("无参构造");
    }

    private Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类:

public class Demo {
    /*将一个map中的数据转存到一个实体类对象中。*/
    @Test
    public void test01() throws IllegalAccessException, NoSuchFieldException, InstantiationException {
        /*利用map存放狗狗的信息*/
        HashMap<String, Object> map = new HashMap<>();
        map.put("name","旺财");
        map.put("age",18);
        /*调用创建对象方法*/
        Dog dog = getObject(map, Dog.class);
        System.out.println(dog);
    }
    /*反射创建对象*/
    public <T>T getObject(Map<String,Object> map,Class<T> c) throws IllegalAccessException, InstantiationException, NoSuchFieldException {
        /*无参构造器创建对象*/
        T t = c.newInstance();
        /*取出map中的狗狗信息*/
        Set<Map.Entry<String, Object>> entries = map.entrySet();
        for (Map.Entry<String, Object> entry : entries) {
            String key = entry.getKey();
            /*获得管理属性权*/
            Field field = c.getDeclaredField(key);
            /*获得私有权限*/
            field.setAccessible(true);
            /*设置属性*/
            field.set(t,entry.getValue());
        }
        return t;
    }
}

运行结果:
Java基础-利用反射动态创建对象_第2张图片

你可能感兴趣的:(Java基础总结,java,反射,class)