ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java进阶之反射

2022-08-11 17:33:52  阅读:214  来源: 互联网

标签:反射 Java 进阶 age Class public name


1、反射机制

  动态语言:是一类在运行时可以改变其结构的语言,主要有Python,PHP,JavaScript等。

  静态语言:运行时结构不可变,如Java,C,C++。但Java可以称为”准动态语言“,即Java有一定的动态性,可以利用反射机制获得类似动态语言的特性。Java的动态性让编程的时候更加灵活。

  Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。

  Class c = Class.forName("java.lang.String")

  加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这面镜子看到类的结构,所以,我们形象的称为:反射。

  正常方式:

  引入需要的”包类“名称——>通过new实例化——>取得实例化对象

  反射方式:

  实例化对象——>getClass()方法——>得到完整的”包类“名称

2、获得反射对象

  Java反射机制提供的功能:

    • 在运行时判断任意一个对象所属的类
    • 在运行时构造任意一个类的对象
    • 在运行时判断任意一个类所具有的成员变量和方法
    • 在运行时获取泛型信息
    • 在运行时调用任意一个对象的成员变量和方法
    • 在运行时处理注解
    • 生成动态代理
    • ......

  优点:可以实现动态创建对象和编译,体现出很大的灵活性。

  缺点:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。着类操作总是慢于直接执行相同的操作。

  反射相关的主要API:

    • java.lang.Class:代表一个类
    • java.lang.reflect.Method:代表类的方法
    • java.lang.reflect.Field:代表类的成员变量
    • java.lang.reflect.Constructor:代表类的构造器
    • ......

  Class类:在Object类中定义了以下的方法,此方法将被所有子类继承

    public final Class getClass()

  以上的方法是返回值的类型是一个Class类,此类是Java反射的源头,实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称。

 1 public class TestReflection {
 2     public static void main(String[] args) throws ClassNotFoundException {
 3         //通过反射获取类的Class对象
 4         Class c1 = Class.forName("com.nk.day06.User");
 5         System.out.println(c1);
 6 
 7         Class c2 = Class.forName("com.nk.day06.User");
 8         Class c3 = Class.forName("com.nk.day06.User");
 9         //一个类在内存中只有一个Class对象
10         //一个类被加载后,类的整个结构都会被封装在Class对象中
11         System.out.println(c2.hashCode());
12         System.out.println(c3.hashCode());
13     }
14 }
15 
16 class User{
17     private String name;
18     private int age;
19 
20     public User() {
21     }
22 
23     public User(String name, int age) {
24         this.name = name;
25         this.age = age;
26     }
27 
28     public String getName() {
29         return name;
30     }
31 
32     public void setName(String name) {
33         this.name = name;
34     }
35 
36     public int getAge() {
37         return age;
38     }
39 
40     public void setAge(int age) {
41         this.age = age;
42     }
43 
44     @Override
45     public String toString() {
46         return "User{" +
47                 "name='" + name + '\'' +
48                 ", age=" + age +
49                 '}';
50     }
51 }

 

标签:反射,Java,进阶,age,Class,public,name
来源: https://www.cnblogs.com/mn2017/p/16576823.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有