Java反射总结

目录

反射概述

Class类的详细

Class类常用方法使用

获取Class对象的三种方式

反射获取构造方法

反射获取变量

反射获取方法

Main方法获取

使用反射跨越泛型检查


反射概述

反射就是指在运行状态中获取任意类的名称、package信息、所有属性、方法、注释、类型、类加载器等

可以使用或者改变对象的属性判断一个对象的类。

Jdk里面的Class这个类就是提供反射的核心

Class类的详细

 

Class类的实例表示运行的java程序和接口,就是说jvm里面存在每个类的的Class对象。

Class类没有构造方法。当Class对象在加载虚拟机时通过类加载器中的defineclass方法自动构造。

Class类常用方法使用

获取Class对象的三种方式

        //第一种new产生一个User对象,一个Class对象
        User user = new User();
        Class c1 = user.getClass();//获取这个Class对象
        System.out.println(c1.getName());
        //第二种
        Class c2 = User.class;
        System.out.println(c1.equals(c2));//判断俩种方法获取的对象是否是同一个
        //第三种
        Class c = Class.forName("com.kyf.ClassStudy.User");//使用物理路径获取
        System.out.println(c.equals(c2));//看是否是一个对象

运行结果

com.kyf.ClassStudy.User
true
true

证明在运行期间一个类只会产生一个Class对象

反射获取构造方法

        System.out.println("===============所有公有构造方法=============");
        Constructor[] constructors = c.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        System.out.println("===============所有构造方法=============");
        Constructor[] declaredConstructors = c.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
        System.out.println("===============所有公有、无参数构造方法=============");
        System.out.println(c.getConstructor(null));
        c.getConstructor(null).newInstance();

        System.out.println("===============所有私有构造方法,并调用=============");
        Constructor declaredConstructor = c.getDeclaredConstructor(int.class);
        System.out.println(declaredConstructor);
//        调用构造方法
        declaredConstructor.setAccessible(true);//忽略访问修饰符
        declaredConstructor.newInstance(12);

        getConstructorClass... parameterTypes

返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。parameterTypes 参数是 Class 对象的一个数组,这些 Class 对象按声明顺序标识构造方法的形式参数类型。

要反映的构造方法是此 Class 对象所表示的类的公共构造方法,其形式参数类型与 parameterTypes 所指定的参数类型相匹配。

  getConstructors()

返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。如果该类没有公共构造方法,或者该类是一个数组类,或者该类反映一个基本类型或 void,则返回一个长度为 0 的数组。

  getDeclaredConstructorClass... parameterTypes

返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识构造方法的形式参数类型。

  getDeclaredConstructors()

返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类存在一个默认构造方法,则它包含在返回的数组中。如果此 Class 对象表示一个接口、一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

        newInstance()

创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化之。

运行结果

  

===============所有公有构造方法=============
public com.kyf.ClassStudy.User(java.lang.String,int)
public com.kyf.ClassStudy.User(char)
public com.kyf.ClassStudy.User()
===============所有构造方法=============
private com.kyf.ClassStudy.User(int)
public com.kyf.ClassStudy.User(java.lang.String,int)
public com.kyf.ClassStudy.User(char)
protected com.kyf.ClassStudy.User(boolean)
public com.kyf.ClassStudy.User()
com.kyf.ClassStudy.User(java.lang.String)
===============所有公有、无参数构造方法=============
public com.kyf.ClassStudy.User()
公有无参构造
===============所有私有构造方法,并调用=============
private com.kyf.ClassStudy.User(int)
私有
age=12

反射获取变量

  getField(String name)

        返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。name 参数是一个 String,用于指定所需字段的简称。

  getFields()

        返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果类或接口没有可访问的公共字段,或者表示一个数组类、一个基本类型或 void,则此方法返回长度为 0 的数组。

  getDeclaredField(String name)

        返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称。注意,此方法不反映数组类的 length 字段。

  getDeclaredFields()

        返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

         变量调用需要Object o = c.getConstructor().newInstance();来产生对象。设置属性这需要获取的属性对象来调用.set(object,“参数”)方法,第一个参数设置对象,第二个用来传参

        System.out.println("===============所有公共属性=============");
        Field[] fields = c.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("===============所有属性=============");
        Field[] declaredFields = c.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        System.out.println("===============所有公共属性并调用=============");
        Field name = c.getField("name");
        System.out.println(name);
        Object o = c.getConstructor().newInstance();
        name.set(o,"张三");
        User u = (User) o;
        System.out.println("验证名字"+u.name);
        System.out.println("===============所有私有属性并调用=============");
        Field phone = c.getDeclaredField("phone");
        System.out.println(phone);
        phone.setAccessible(true);
        phone.set(o,"12345678911");
        System.out.println("电话验证"+u);

运行结果

===============所有公共属性=============
public java.lang.String com.kyf.ClassStudy.User.name
===============所有属性=============
public java.lang.String com.kyf.ClassStudy.User.name
char com.kyf.ClassStudy.User.sex
protected int com.kyf.ClassStudy.User.age
private java.lang.String com.kyf.ClassStudy.User.phone
===============所有公共属性并调用=============
public java.lang.String com.kyf.ClassStudy.User.name
公有无参构造
验证名字张三
===============所有私有属性并调用=============
private java.lang.String com.kyf.ClassStudy.User.phone
电话验证User{name='张三', sex= , age=0, phone='12345678911'}

反射获取方法

Method show4 = c.getDeclaredMethod("show4",int.class);

制定方法,第一个参数是方法名称,第二个是类型名称

show4.setAccessible(true);

解除私有属性

Object invoke = show4.invoke(o1, 20);

对获取的对象传入参数第一个对象,第二个参数

并且获取返回值

        System.out.println("===============获取所有公共方法=============");
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("===============获取所有方法=============");
        Method[] declaredMethods = c.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        System.out.println("===============获取公共show1方法=============");
        System.out.println(c.getMethod("show1", String.class));
        Object o1 = c.getConstructor().newInstance();
        c.getMethod("show1", String.class).invoke(o1,"张三");

        System.out.println("===============获取私有show4方法=============");
        Method show4 = c.getDeclaredMethod("show4",int.class);
        System.out.println(show4);
        show4.setAccessible(true);
        Object invoke = show4.invoke(o1, 20);
        System.out.println("返回值="+invoke);

运行结果

===============获取所有公共方法=============
public static void com.kyf.ClassStudy.User.main(java.lang.String[])
public java.lang.String com.kyf.ClassStudy.User.toString()
public void com.kyf.ClassStudy.User.show1(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
===============获取所有方法=============
public static void com.kyf.ClassStudy.User.main(java.lang.String[])
public java.lang.String com.kyf.ClassStudy.User.toString()
public void com.kyf.ClassStudy.User.show1(java.lang.String)
private java.lang.String com.kyf.ClassStudy.User.show4(int)
void com.kyf.ClassStudy.User.show3()
protected void com.kyf.ClassStudy.User.show2()
===============获取公共show1方法=============
public void com.kyf.ClassStudy.User.show1(java.lang.String)
公有无参构造
我是公有的方法,有参数张三
===============获取私有show4方法=============
private java.lang.String com.kyf.ClassStudy.User.show4(int)
我是私有的方法还带返回值
返回值=abcd

Main方法获取

        Method main = c.getMethod("main", String[].class);
        main.invoke(null,(Object) new String[]{});

运行结果

 

mian方法执行.......

使用反射跨越泛型检查

List<String> list = new ArrayList();
        list.add("abc");
        list.add("def");
        Class listClass = list.getClass();
        Method add = listClass.getMethod("add", Object.class);
        add.invoke(list,123);
        for (Object obj : list) {
            System.out.println(obj);
        }

运行结果

abc
def
123

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值