反射:reflect(二)

-

反射:reflect

        反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也是用一个个Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应的实例对象来表示,他们是FieldMethodContructorPackage、等。

反射:程序的运行时期,对一个类的字节码文件(class)进行解剖,解剖后,看到字节码文件中定义的内容、成员方法、成员变量、构造方法可以运行这个方法,成员变量。、

简单来说:编译时期不知道运行谁,运行时期也不知道运行谁,运行的类和方法,由用户指定。

 

反射相关的东西

 Java是面向对象的语言,class文件也是对象,有一个类,描述这个class文件的,java.lang.Class

构造方法也是一个对象,Constructor类。

成员方法也是一个对象,Method类。

成员变量也是一个对象,Filed类。

 

获取到一个类的字节码文件对象

getClass()

类名.class

Class.forName()

 

获取字节码文件中的构造方法,并运行

getConstructor(参数)获取构造方法。

getConstructors()获取所有public的构造方法,存储数组。

getDeclaredConstructor(参数)获取所有的构造方法,非public

Constructor类的 newInstance()运行获取到的构造方法。

 

获取成员方法并运行

getMethods()获取成员方法,存储数组。

getMethod(方法名,参数列表)

getDeclaredMethod(方法名,参数列表)

Method类的 invoke(对象,方法的参数)

实例:

[java] view plaincopyprint?
01.public class Person {  
02.    public Person(int x) {  
03.  
04.    }  
05.  
06.    public Person(String s) {  
07.        this.name = s;  
08.    }  
09.  
10.    private Person() {  
11.  
12.    }  
13.  
14.    public String name;  
15.    private int age;  
16.  
17.    public void show() {  
18.        System.out.println(name + ":::show:::" + age);  
19.    }  
20.  
21.    public void show(int x) {  
22.        System.out.println(name + ":::show:::" + age + x);  
23.  
24.    }  
25.  
26.    private void method() {  
27.        System.out.println("private method");  
28.    }  
29.  
30.    public String toString() {  
31.        return "Person...toString" + name;  
32.    }  
33.}  

获取字节码文件对象:

[java] view plaincopyprint?
01./* 
02. * 获取字节码文件对象 
03. */  
04.public class ReflectDemo1 {  
05.    public static void main(String[] args) throws Exception {  
06.        method();  
07.    }  
08.  
09.    // 获取字节码文件对象  
10.    private static void method() throws Exception {  
11.        // 第一种方式,通过对象获取,对象的getClass方法  
12.        // Person p = new Person();  
13.        // public final Class<?> getClass() Person.class字节码文件对象  
14.        // Class c = p.getClass();  
15.        // System.out.println(c);  
16.  
17.        // 第二种方法,通过Person类直接获取,任意的数据类型,都有一个静态属性class返回字节码文件对象  
18.        Class c1 = Person.class;  
19.        // System.out.println(c==c1);//T  
20.        // System.out.println(c.equals(c1));//T  
21.  
22.        // 第三种方法,使用Class类中的静态方法 forName(String 类名)  
23.        Class c2 = Class.forName("cn.itcast.reflect.Person");  
24.        System.out.println(c2);  
25.        System.out.println(c1 == c2);  
26.    }  
27.  
28.}  

获得构造方法,运行

[java] view plaincopyprint?
01.import java.lang.reflect.*;  
02.  
03./* 
04. * 获得构造方法,运行 
05. */  
06.public class ReflectDemo2 {  
07.    public static void main(String[] args) throws Exception {  
08.        method();  
09.    }  
10.  
11.    private static void method() throws Exception {  
12.        // 获得字节码文件对象  
13.        Class clazz = Class.forName("cn.itcast.reflect.Person");  
14.        // public Constructor<?>[] getConstructors() 获取构造方法,存储成数组,构造方法public权限  
15.        Constructor[] con = clazz.getConstructors();  
16.        for (Constructor c : con) {  
17.            System.out.println(c);  
18.        }  
19.        // Constructor<T> getConstructor(Class<?>... parameterTypes)  
20.        // 带有一个String类型参数的构造方法  
21.        Constructor c = clazz.getConstructor(String.class);  
22.        // 运行构造方法 public T newInstance(Object... initargs)  
23.        Object obj = c.newInstance("我是谁");  
24.        System.out.println(obj);  
25.  
26.        // 获取私有构造方法并运行  
27.        Constructor con1 = clazz.getDeclaredConstructor();  
28.        System.out.println("----" + con1);  
29.        con1.setAccessible(true);// 暴力访问  
30.        Object obj1 = con1.newInstance();  
31.        System.out.println(obj1);  
32.  
33.    }  
34.  
35.}  




 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值