java的反射解释及应用

1.什么叫做反射

将类中成员属性以及方法映射为一个个对象叫做反射

2.什么是反射机制

在运行状态中,对于每个类都可以知道这个类中属性和方法,对于任意一个对象都可以通过这个对象去调用属性和方法,对于这种动态获取数据的能力叫做反射机制

3.反射对象(也叫类对象)

当程序运行时,jvm将.class(字节码)文件从磁盘加载到内存的方法区中,然后jvm和类加载器会一起加载.class文件,生成类对象(反射对象)。一个类只会生成一个类对象,也叫反射对象

4.获取发射对象

全限定类名:包名.类名

4.1对象.geclass()

4.2类名.class()

4.3class.forname(全限定类名)

5.用反射对象操作类的属性

public class Cat {
    private String name;
    private Integer age;
    private Cat(){

    }
    private Cat(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class <Cat> c1 = (Class<Cat>) Class.forName("com.ycl.day_10_30.constructor.Cat");
        Constructor <Cat> constructorTest1 = c1.getDeclaredConstructor(String.class,Integer.class);
        constructorTest1.setAccessible(true);
        System.out.println("当前构造方法的访问修饰符="+constructorTest1.getModifiers());
        System.out.println("当前构造方法的名称"+constructorTest1.getName());
        System.out.println("当前构造方法的参数类型"+ Arrays.toString(constructorTest1.getGenericParameterTypes()));

        Cat cat = constructorTest1.newInstance("小美",22);
        //实例方法的属性还是调不出来
        System.out.println(cat.toString());
    }


}
com.ycl.day_10_30.constructor.Test
当前构造方法的访问修饰符=2
当前构造方法的名称com.ycl.day_10_30.constructor.Cat
当前构造方法的参数类型[class java.lang.String, class java.lang.Integer]
Cat{name='小美', age=22}


6.用反射对象操作类的方法

public class Cat {
    private String name;
    private Integer age;
    private Cat(){

    }
    Cat(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    private void jump(String name){
        System.out.println(name+"在跳");
    }
    private void Call(String name){
        System.out.println(name+"在叫");
    }
    private void eat(String name){
        System.out.println(name+"在吃");
    }


}
public class Test1 {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        fansheMethodTest();
    }
    public static void fansheMethodTest() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //类的实例化,用于最下面的对象调用方法
        Cat cat = new Cat("小美",2);
        //获取类对象
        Class<Cat> c1 = (Class<Cat>) cat.getClass();
        //获取类对象方法
        Method m1 = c1.getDeclaredMethod("jump", String.class);
        //禁止类加载和jvm在加载.class文件对对访问修饰符的检测
        m1.setAccessible(true);
        //获取方法的访问权限 1对应public,2对应priva
        System.out.println(m1.getModifiers());
        //获取方法的返回值类型
        System.out.println(m1.getGenericReturnType());
        //返回方法参数类型
        System.out.println(Arrays.toString(m1.getGenericParameterTypes()));
        //实例对象调用方法(不管方法是私有的还是公共的)
        m1.invoke(cat,"小王");//效果等同于cat.jump(String name);
    }
}
2
void
[class java.lang.String]
小王在跳


7.用反射对象操作类的构造方法

public class Cat {
    private String name;
    private Integer age;
    private Cat(){

    }
    Cat(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    private void jump(String name){
        System.out.println(name+"在跳");
    }
    private void Call(String name){
        System.out.println(name+"在叫");
    }
    private void eat(String name){
        System.out.println(name+"在吃");
    }


}
public class Test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class <Cat> c1 = (Class<Cat>) Class.forName("com.ycl.day_10_30.constructor.Cat");
        Constructor <Cat> constructorTest1 = c1.getDeclaredConstructor(String.class,Integer.class);
        constructorTest1.setAccessible(true);
        System.out.println("当前构造方法的访问修饰符="+constructorTest1.getModifiers());
        System.out.println("当前构造方法的名称"+constructorTest1.getName());
        System.out.println("当前构造方法的参数类型"+ Arrays.toString(constructorTest1.getGenericParameterTypes()));

        Cat cat = constructorTest1.newInstance("小美",22);
        //实例方法的属性还是调不出来
        System.out.println(cat.toString());
    }





}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值