码迷,mamicode.com
首页 > 其他好文 > 详细

1、反射-概述(Class)

时间:2019-05-21 22:38:59      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:turn   运行时   field   成员   reflect   cep   字段   string   show   

 

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)

标签:turn   运行时   field   成员   reflect   cep   字段   string   show   

原文地址:https://www.cnblogs.com/Mrchengs/p/10902800.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!