1反射-概述(Class)

Posted mrchengs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1反射-概述(Class)相关的知识,希望对你有一定的参考价值。

 

Java Reflection

Reflection(反射)是被视为静态语言的关键

反射机制允许程序员在执行期间借助于Reflection API取得任何类内部信息

并能直接操作任意对象的内部属性及方法

 

提供的功能

1、运行时判断任意一个对象所属的类

2、运行时构造任意一个类对象

3、运行时判断任意一个类所具有的成员变量和方法

4、运行时调用任意一个对象的成员变量和方法

5、生成动态代理

 

相关的API:

java.lang.Class:代表一个类

java.lang.reflect.Method:代表类的方法

java.lang.reflect.Field:代表类的成员变量

java.lang.reflect.Constructor:代表类的构造方法啊

 

 

Field提供如下几种方法:
1:Class.getDeclaredField(String name);

返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段(包括私有成员)。

field.setAccessible(true);

2:Class.getDeclaredFields();

 返回 Field 对象的一个数组,该数组包含此 Class 对象所表示的类或接口所声明的所有字段(包括私有成员)。

3:Class.getField(String name);

返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

4:Class.getFields();

返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段。

 

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public Person() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void show(){
        System.out.println("show方法...");
    }

    public int display(int age){
    System.out.println("age:" + age);
    return age; } 

  @Override
  
  public String toString() { return "Person{" + "name=‘" + name + \\‘ + }; } }

@Test
public void test1() throws Exception, InstantiationException {
//栈空间的引用---堆空间的实体
Class<Person> clazz = Person.class;

//1、创建clazz对应的运行时类Person对象
Person person = clazz.newInstance();
System.out.println(person);

//2、通过反射调用运行时指定的属性
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(person,"M");
System.out.println(person);

//3、通过反射调用运行时方法
Method show = clazz.getMethod("show");
show.invoke(person);
Method display = clazz.getMethod("display", int.class);
display.invoke(person,2);


}

技术图片

 

 

Class

java.lang.Class:是反射的源头

public final Class getClass()

Person.getClass()//通过运行时类的对象,调用getClass()返回其运行时类

  

可以借助图解进行理解

 技术图片

 

1、创建一个类

2、通过javac.exe进行编译生成对应的.class文件

3、使用java.exe加载(JVM的类加载器).class文件

4、.class文件加载到内存以后,就是一个运行时类,存在缓存区

5、运行时类本身就是一个Class的实例

6、每一个运行时类只加载一次

 

 

有了Class的实例之后可以进行的操作:

1、创建对应的运行时对象

2、获取对应额运行时类的完整结构(属性,方法、内部类...)

3、调用对象的运行时类的指定的结构(属性、方法、构造器)

4、反射的应用动态代理

以上是关于1反射-概述(Class)的主要内容,如果未能解决你的问题,请参考以下文章

1反射-概述(Class)

反射机制

万恶之源-Class类型反射

Java反射机制详解

Java-反射机制(超详解)

步步UP2️⃣——反射的获取字节码Class对象和Class对象功能概述