java 反射的理解和使用

来源:互联网 发布:网络舆论论文 编辑:程序博客网 时间:2024/05/21 11:01

Person 类:

public class Person{    private String name;    private Integer age;    public Person(String name, Integer age) {        this.name = name;        this.age = age;    }    public Person() {    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public void run(){        System.out.println("我在运行哦");    }    public void test(String test){        System.out.println(test);    }    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }}

反射:

package Reflect;import org.junit.jupiter.api.Test;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * Create by wdful * Email: wdful165177@gmail.com * Date: 2017/5/16 * 反射测试 */public class ReflectDemo1 {    @Test    /**     * 反射三种方式     */    public void demo1() throws ClassNotFoundException {        //1        Class clazz1 = Person.class;        System.out.println(clazz1);        //2        Person person = new Person();        Class clazz2 = person.getClass();        System.out.println(clazz2);        //3        Class clazz3 = Class.forName("Reflect.Person");        System.out.println(clazz3);    }    @Test    /**     * 反射调构造     */    public void demo2() throws Exception {        Class clazz = Class.forName("Reflect.Person");        System.out.println(clazz);        //获得对象        Person person = (Person)clazz.newInstance();        //调用构造        Constructor c = clazz.getConstructor(String.class,Integer.class);        Person p = (Person)c.newInstance("里斯",123);        System.out.println(p);    }    @Test    /**     * 反射调get set     */    public void demo3() throws Exception {        Class clazz = Class.forName("Reflect.Person");        //获得公有的       /*clazz.getField("name");       Field[] fields = clazz.getFields(); //获取所有的*/       //获取私有的        Field field1 = clazz.getDeclaredField("name");        Field field2 = clazz.getDeclaredField("age");        field1.setAccessible(true);        field2.setAccessible(true);        Person person = (Person) clazz.newInstance();        //调用构造        Constructor c = clazz.getConstructor(String.class,Integer.class);        Person p = (Person) c.newInstance("里斯",123);        String name = (String) field1.get(p);        int age = (int) field2.get(p);        System.out.println(name+":"+age);    }    @Test    /**     * 反射调方法     */    public void demo4() throws Exception{        Class clazz = Class.forName("Reflect.Person");        Method method = clazz.getDeclaredMethod("run");        method.setAccessible(true);        method.invoke(clazz.newInstance()); //无参        //有参        Method method2 = clazz.getDeclaredMethod("test",String.class);        String s = (String)method2.invoke(clazz.newInstance(),"我是test方法的值");        System.out.println(s);    }    public static void main(String[] args) throws Exception {        ReflectDemo1 r = new ReflectDemo1();        r.demo2();    }}

原创粉丝点击