Java反射详解及总结

Java反射详解及总结反射就是指在运行状态中获取任意类的名称、package信息、所有属性、方法、注释、类型、类加载器等可以使用或者改变对象的属性判断一个对象的类。

欢迎大家来到IT世界,在知识的湖畔探索吧!

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

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

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

Class类的详细

Java反射详解及总结

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));//看是否是一个对象

欢迎大家来到IT世界,在知识的湖畔探索吧!

运行结果

欢迎大家来到IT世界,在知识的湖畔探索吧!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);

getConstructor(Class… parameterTypes

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

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

getConstructors()

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

getDeclaredConstructor(Class… parameterTypes

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

getDeclaredConstructors()

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

newInstance()

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

运行结果

欢迎大家来到IT世界,在知识的湖畔探索吧!===============所有公有构造方法=============
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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/33906.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信