关于反射的用法

一、获取反射的三种方法

  1. 在源文件阶段可以用class.forName(“类的全路径”)方法获取类对象
  2. 在class文件阶段可以用类名.class方法获取类对象
  3. 在实例化对象阶段可以用对象名.getclass方法获取类对象
package com.java.demo01;

public class Test {
    public static void main(String[] args) throws Exception {
        //获取反射对象,person类自己根据需求创建
        Class<?> clazz1 = Class.forName("com.java.demo01.Person");
        Class<Person> clazz2 = Person.class;
		//判断三种方式获取类对象的结果是否一致
        System.out.println(clazz1 == clazz2);
        System.out.println(clazz1);
        System.out.println(clazz2);

        Person p = new Person();
        Class<? extends Person> clazz3 = p.getClass();

        System.out.println(clazz2 == clazz3);
    }
}

二、使用无参构造器创建一个对象

前提是自己创建一个类(类中包含字段和无参构造器)

  1. 使用反射的方法获取类
  2. 用newInstance()方法获取类的实例化对象
package com.java.demo02;

public class Test {
    public static void main(String[] args) throws Exception {
        //使用反射获取一个类
        Class<Person> clazz = (Class<Person>) Class.forName("com.java.demo02.Person");
        //实例化对象(使用无参构造器的方式创建)
        Person person = clazz.newInstance();
        //获取对象中的相关信息
        person.setAge(20);
        person.setName("张三");
        System.out.println(person);
    }
}

三、获取一个类中的所有构造器与使用有参构造器获取一个实例对象

  1. 使用反射的方法获取类class.forName
  2. 用 类对象.getConstructors();方法获取类的实例化对象
package com.java.demo03;

import java.lang.reflect.Constructor;

public class Test {
    public static void main(String[] args) throws Exception {
        //获取源文件
        Class<Person> clazz = (Class<Person>) Class.forName("com.java.demo03.Person");
        //获取所有的构造方法
        Constructor<Person>[] constructors = (Constructor<Person>[]) clazz.getConstructors();
        //遍历所有的构造器
        for(Constructor constructor : constructors){
            System.out.println(constructor);
        }
    }
}

四、获取类中的字段

类对象.getFiled()方法获取

五、暴力获取所有字段(包括私有字段)

字段.setAccessible(tue)

六、为一个私有字段赋值

字段.setAccessible(tue)将私有字段暴力破解成公开的即可用set方法赋值

package com.java.demo07;

import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws Exception {
        //获取源文件
        Class<Person> clazz = (Class<Person>) Class.forName("com.java.demo07.Person");
        //使用无参构造方法实例化一个对象
        Person person = clazz.newInstance();
        person.setName("张三");
        System.out.println("改变私有字段之前的值:" + person.getName());
        //暴力获取私有字段(包括公有字段)
        Field field = clazz.getDeclaredField("name");
        field.setAccessible(true);    //类似于把私有权限公开了
        field.set(person,"李四");
        System.out.println("改变私有字段之后的值:" + person.getName());

    }
}

七、获取类中所有的公开的方法

类对象.getMethods()方法,返回的值是一个数组

package com.java.demo08;

import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        //获取源文件
        Class<Person> clazz = (Class<Person>) Class.forName("com.java.demo08.Person");
        //获取类中的所有公开的方法(包括父类中的所有公开的方法)
        Method[] methods = clazz.getMethods();
        for(Method method : methods){
            System.out.println(method);
        }
    }
}

八、获取类中所有的方法(包括私有方法)

类对象.getDeclaredMethods();

九、方法的调用

a.invoke(对象名b,参数c),a代表方法名,b代表实例化对象的名称,c代表要传输的参数,没有参数可以无视。
没有使用反射时正常方法的调用时b.a©。

package com.java.demo10;

import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        //获取源文件
        Class<Person> clazz = (Class<Person>) Class.forName("com.java.demo10.Person");
        //获取类的实例对象
        Person person = clazz.newInstance();
        Method m = clazz.getMethod("eat", String.class);
        //使用反射调用方法
        m.invoke(person,"饭");
    }
}

十、获取某个继承了哪些类

对象名.getsuperclass()可以查看父类的类对象

新手上路,有不对的地方可以留言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值