Java反射总结

获取类的class对象

		//获取类名
        //第一种方式
        Class c1 = Class.forName("reflect.Student");
        //第二种方式
        Class c2 = Student.class;
        //第三种方式
        Class c3 = new Student().getClass();

        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println((c1 == c2));
        System.out.println((c1 == c3));

获取构造方法

		System.out.println("-------------------获取到的构造方法-----------------");
        //获取构造方法,新建对象
        Constructor[] declaredConstructors = c1.getDeclaredConstructors();
        for (Constructor con : declaredConstructors) {

            System.out.println("构造方法名:" + con.getName() + " ,参数个数:" + con.getParameterCount());
        }
        System.out.println("-------------------222222-----------------");

        //此处获取有参数的构造方法
        Constructor constructor = c1.getConstructor(String.class, int.class, String.class);
        System.out.println("构造方法名:" + constructor.getName() + " ,参数个数:" + constructor.getParameterCount());
        System.out.println("-------------------33333-----------------");

        Student xiaoming = (Student) constructor.newInstance("小明", 20, "苏州");
        System.out.println(xiaoming);
        

获取成员变量


		System.out.println("-------------------获取到到成员变量-----------------");

        //获取成员变量,可以获取所有的成员变量
        Field[] fields = c1.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName() + " " + field.getType());
        }
        System.out.println("-------------------5555555-----------------");

        //只能获取public属性
        Field address = c1.getField("address");
        System.out.println(address.getName() + " " + address.getType());
        System.out.println("-------------------6666666-----------------");

        //此时小明的地址被改为南京了
        address.set(xiaoming, "南京");
        System.out.println(xiaoming);
       

获取方法



        System.out.println("-------------------获取到的方法-----------------");


        //获取所有方法
        Method[] methods = c1.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("方法名:" + method.getName() + ",方法参数个数: " + method.getParameterCount());
        }
        System.out.println("-------------------8888888-----------------");

        //只能获取到public方法
        Method study = c1.getMethod("study", String.class);
        study.invoke(xiaoming, "英语");
        System.out.println("-------------------999999-----------------");

        //可以获取private方法
        Method write = c1.getDeclaredMethod("write");
        //暴力修改访问属性,否则报错
        write.setAccessible(true);
        write.invoke(xiaoming);

绕过编译器,在运行时大显身手


        System.out.println("针对arraylist的操作");
        //神奇之处
        ArrayList<Integer> list = new ArrayList<>();
        list.add(2);
        list.add(3);
        //此处无法加入,因为编译器认为只能加入Integer类型的,但是到了运行阶段,范型已经消失了
        ArrayList<String> list2 = new ArrayList<>();
        System.out.println(list.getClass() == list2.getClass());
        //list.add("java");
        Method add = list.getClass().getDeclaredMethod("add", Object.class);
        add.invoke(list, "小明");
        add.invoke(list, xiaoming);
        System.out.println(list);

完整代码

package reflect;


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

/**
 * @author micro.cloud.fly
 * @date 2022/7/6 3:36 下午
 * @desc
 */
public class Demo {
    public static void main(String[] args) throws Exception {
        //获取类名
        //第一种方式
        Class c1 = Class.forName("reflect.Student");
        //第二种方式
        Class c2 = Student.class;
        //第三种方式
        Class c3 = new Student().getClass();

        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println((c1 == c2));
        System.out.println((c1 == c3));
        System.out.println("-------------------获取到的构造方法-----------------");
        //获取构造方法,新建对象
        Constructor[] declaredConstructors = c1.getDeclaredConstructors();
        for (Constructor con : declaredConstructors) {

            System.out.println("构造方法名:" + con.getName() + " ,参数个数:" + con.getParameterCount());
        }
        System.out.println("-------------------222222-----------------");

        //此处获取有参数的构造方法
        Constructor constructor = c1.getConstructor(String.class, int.class, String.class);
        System.out.println("构造方法名:" + constructor.getName() + " ,参数个数:" + constructor.getParameterCount());
        System.out.println("-------------------33333-----------------");

        Student xiaoming = (Student) constructor.newInstance("小明", 20, "苏州");
        System.out.println(xiaoming);
        System.out.println("-------------------获取到到成员变量-----------------");

        //获取成员变量,可以获取所有的成员变量
        Field[] fields = c1.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName() + " " + field.getType());
        }
        System.out.println("-------------------5555555-----------------");

        //只能获取public属性
        Field address = c1.getField("address");
        System.out.println(address.getName() + " " + address.getType());
        System.out.println("-------------------6666666-----------------");

        //此时小明的地址被改为南京了
        address.set(xiaoming, "南京");
        System.out.println(xiaoming);


        System.out.println("-------------------获取到的方法-----------------");


        //获取所有方法
        Method[] methods = c1.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("方法名:" + method.getName() + ",方法参数个数: " + method.getParameterCount());
        }
        System.out.println("-------------------8888888-----------------");

        //只能获取到public方法
        Method study = c1.getMethod("study", String.class);
        study.invoke(xiaoming, "英语");
        System.out.println("-------------------999999-----------------");

        //可以获取private方法
        Method write = c1.getDeclaredMethod("write");
        //暴力修改访问属性,否则报错
        write.setAccessible(true);
        write.invoke(xiaoming);

        System.out.println("针对arraylist的操作");
        //神奇之处
        ArrayList<Integer> list = new ArrayList<>();
        list.add(2);
        list.add(3);
        //此处无法加入,因为编译器认为只能加入Integer类型的,但是到了运行阶段,范型已经消失了
        ArrayList<String> list2 = new ArrayList<>();
        System.out.println(list.getClass() == list2.getClass());
        //list.add("java");
        Method add = list.getClass().getDeclaredMethod("add", Object.class);
        add.invoke(list, "小明");
        add.invoke(list, xiaoming);
        System.out.println(list);
    }
}
package reflect;

import lombok.Data;
import lombok.extern.java.Log;

/**
 * @author micro.cloud.fly
 * @date 2022/7/6 3:34 下午
 * @desc
 */

@Log
@Data
public class Student {
    private String name;
    private int age;
    public String address;

    public Student() {

    }

    public Student(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public void study(String subject) {
        System.out.println(name + "在学习" + subject + "~~~");
    }

    private void write() {
        System.out.println(name + "在写字~~~");
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

micro_cloud_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值