Java反射

2018-10-06  本文已影响0人  磊_5d71
图片.png

反射常用对象概述

Class类

图片.png
package com.alan.reflect;

import com.alan.entity.Person;
import org.junit.Test;

public class ClassTest {

    @Test
    /**
     * 获得Class对象
     * 1、类名.class
     * 2、对象.getClass()
     * 3、Class.forName()
     */
    public void demo1() throws ClassNotFoundException {
        //1、类名.class
        Class<Person> class1 = Person.class;
        //2、对象.getClass()
        Person person = new Person();
        Class<? extends Person> class2 = person.getClass();
        //3、Class.forName() 通常采用这种方式获得
        Class<?> class3 = Class.forName("com.alan.entity.Person");
    }
}

Constructor类

图片.png
package com.alan.reflect;

import com.alan.entity.Person;
import org.junit.Test;

import java.lang.reflect.Constructor;

/**
 * 获得Constructor对象
 */
public class ConstructorTest {

    @Test
    /**
     * 获得无参构造
     */
    public void demo1() throws Exception {
        //获得类的字节码文件对应的对象
        Class class1 = Class.forName("com.alan.entity.Person");
        //获得无参构造方法
        Constructor constructor = class1.getConstructor();
        //通过构造器来实例化一个对象
        Person person = (Person) constructor.newInstance(); //相当于 Person person = new Person();
        person.eat();
    }

    @Test
    /**
     * 获得有参构造,并实例化
     */
    public void demo2() throws Exception{
        //获得类的字节码文件对应的对象
        Class class1 = Class.forName("com.alan.entity.Person");
        //获得有参构造
        Constructor constructor = class1.getConstructor(String.class, String.class);
        //通过带参构造器实例化对象
        Person person = (Person) constructor.newInstance("alan", "male");//相当于 Person person = new Person("alan","male");
        System.out.println(person);
    }
}

Field类

图片.png
package com.alan.reflect;

import com.alan.entity.Person;
import org.junit.Test;

import java.lang.reflect.Field;

public class FiledTest {

    @Test
    /**
     * 测试公有属性,一般没有必要反射,直接可以通过对象获取
     */
    public void demo() throws Exception {

        //获得类字节码文件对应的对象
        Class<?> class1 = Class.forName("com.alan.entity.Person");
        //获得属性值
        Field name = class1.getField("name");
        //操作属性,JDK9以后建议使用新方法class1.getDeclaredConstructor().newInstance()
        Person person = (Person) class1.getDeclaredConstructor().newInstance();
        name.set(person,"你好啊");  //相当于 person.name = "你好啊"
        System.out.println(name.get(person));

    }


    @Test
    /**
     * 测试私有属性
     */
    public void demo2() throws Exception {
        //获得类字节码文件对应的对象
        Class class1 = Class.forName("com.alan.entity.Person");
        //获得属性值
        Field name = class1.getDeclaredField("name");
        //给私有属性赋值
        Person person = (Person) class1.getDeclaredConstructor().newInstance();
        //设置私有属性可访问权限
        name.setAccessible(true);
        name.set(person,"小二郎");
        //打印输出
        System.out.println(name.get(person));
    }
}

Method类

图片.png
package com.alan.reflect;

import com.alan.entity.Person;
import org.junit.Test;

import java.lang.reflect.Method;

public class MethodTest {

    @Test
    /**
     * 测试公有方法
     */
    public void demo1() throws Exception {

        Class<?> class1 = Class.forName("com.alan.entity.Person");
        //实例化
        Person person = (Person) class1.getDeclaredConstructor().newInstance();
        //获得公有方法
        Method method = class1.getMethod("eat");
        //执行方法
        method.invoke(person); //相当于person.eat();


    }

    @Test
    /**
     * 测试私有方法
     */
    public void demo2() throws Exception {

        Class<?> class1 = Class.forName("com.alan.entity.Person");
        //实例化
        Person person = (Person) class1.getDeclaredConstructor().newInstance();
        //获得私有方法
        Method method = class1.getDeclaredMethod("run");
        //设置私有方法访问权限
        method.setAccessible(true);
        //执行方法
        method.invoke(person);


    }

    @Test
    /**
     * 测试带参私有方法
     */
    public void demo3() throws Exception {

        Class<?> class1 = Class.forName("com.alan.entity.Person");
        //实例化
        Person person = (Person) class1.getDeclaredConstructor().newInstance();
        //获得私有方法
        Method method = class1.getDeclaredMethod("sayHello", String.class);
        //设置私有方法访问权限
        method.setAccessible(true);
        //执行方法
        String str = (String) method.invoke(person, "小鄂鄂");
        System.out.println(str);

    }

}
上一篇 下一篇

猜你喜欢

热点阅读