java反射机制

java反射机制研究及应用

java反射机制提供的功能:

1.在运行时判断任意一个对象所属的类

2.在运行时构造任意一个类的对象

3.在运行时判断任意一个类所具有的成员变量和方法

4.在运行时获取泛型信息

5.在运行时调用任意一个对象的成员变量和方法

6.在运行时处理注解‘

7.生成动态代理

反射相关的主要API

java.lang.Class; //代表一个类
java.lang.reflect.Method; //代表类的方法
java.lang.reflect.Field; //代表类的成员变量
java.lang.reflect.Constructor;//代表类的构造器
.......

反射的优缺点

优点

1.提高了java程序的灵活性和扩展性,降低了耦合度,提高了自适应能力

2.允许程序创建和控制任何类的对象,无需提前硬编码目标类

缺点

1.反射性能较低,反射机制主要应用在对灵活性和扩展性要求很高的系统框架上

2.反射会模糊程序内部逻辑,可读性较差。

 

Person类

package atguigu01_example;

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

    public Person() {
        System.out.println("Person()...");
    }

    public Person(int age) {
        this.age = age;
    }

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

    public void show(){
        System.out.println("你好,我是一个Person");
    }
    private String showNation(String nation){
        return "我的国籍是:"+nation;
    }

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

测试类

package atguigu01_example;

import org.junit.Test;

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

public class ReflectionTest {
    /**
     * 使用反射之前可以执行的操作
     */
    @Test
    public void test1(){
       //1.创建Person的实例
        Person p1=new Person();

        //2.调用属性
        p1.age=10;
        System.out.println(p1.age);

        //调用方法
        p1.show();
    }

    /**
     * 使用反射完成上述操作
     */
    @Test
    public void test2() throws Exception {
        //1.创建Person的实例
        Class clazz=Person.class;
        Person p1= (Person) clazz.newInstance();
        System.out.println(p1);

        //2.调用属性
        Field ageField=clazz.getField("age");
        ageField.set(p1,10);
        System.out.println(ageField.get(p1));

        //调用方法
        Method showMethod=clazz.getMethod("show");
        showMethod.invoke(p1);

    }

    /**
     * 出了Person类后,就不能直接调用Person类中声明的private权限修饰的结构
     * 但是可以通过反射的方式调用PerSon类中私有的结构  -->暴力反射
     */
    @Test
    public void test3() throws Exception {
        //调用私有构造器
        Class clazz=Person.class;
        Constructor cons=clazz.getDeclaredConstructor(String.class,int.class);
        cons.setAccessible(true);
        Person p1=(Person)cons.newInstance("Tom",12);
        System.out.println(p1);

        //调用私有的属性
        Field name = clazz.getDeclaredField("name");
        name.setAccessible(true);
        name.set(p1,"Jerry");
        System.out.println(name.get(p1));

        //调用私有方法
        Method showNationMethod=clazz.getDeclaredMethod("showNation", String.class);
        showNationMethod.setAccessible(true);
        String info= (String) showNationMethod.invoke(p1,"CHN");
        System.out.println(info);

    }
}

 

posted @ 2023-10-26 16:30  柒酒  阅读(39)  评论(0)    收藏  举报