Java 反射 reflection

spring源代码,其基本原理如依赖注入、aop、以及xml技术,动态反射机制

Reflection

学习反射原理,了解几个重要的类会比较好:java.lang.Class, java.lang.reflect中的Method、Field、Constructor等classes。

java反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法

demo

class Person{
private long id;
private int age;
private String name;

public Person(){
}

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

@Override
public  String toString(){
return "Name="+getName()+"  Age ="+getAge()+"       Id"+getId();
}

public long getId(){
return id;
}

public void setId(long id){
this.id = id;
}

public int getAge(){
return age;
}

public void setAge(int age){
this.age = age;
}

public String getName(){
return name;
}

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

public static void main(String[] args) throws Exception{

//获取Person类的Class对象
Class<?> classType = Class.forName("Person");

//调用Person类的两个参数构造函数构造方法生成对象
Constructor constructor = classType.getConstructor(new Class[]{String.class, int.class});
Object object = constructor.newInstance(new Object[]{"Dean",25});

//获取SetId方法
Method setId = classType.getMethod("setId",new Class[]{long.class});

//调用setId方法设置Id
setId.invoke(object, new Object[]{10});

//调用toString输出结果
Method toString = classType.getMethod("toString",new Class[]{});
String result = (String)toString.invoke(object,new Object[]{});
System.out.println(result);
}
}
  • 基于类的反射
  • 基于字段的反射
  • 基于方法的反射
  • 数组的反射

introspection: the ability of the program to examine itself.

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
-Class类:代表一个类
-Method类:代表类的成员变量
-Constructor类:代表类的构造方法
-Array类:提供了动态创建数组,以及访问数组的元素的静态的方法

在java.lang.Object类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。

Class类是Reflection API中的核心类,它有以下方法

-getName();
-getFields();
-getDeclaredFields();
-getMothods();
-getDeclaredMethods();
-getConstructors();
-getConstructor(Class[] parameter Types);
-newInstance();

通过默认构造方法创建一个新对象

Object objectCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});

获得对象的所有属性:
Field fields[]=classType.getDeclaredFields();
. Class类的getDeclaredFields()方法返回类的所有属性,包括public,protected,默认和private访问级别的属性

Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回。

获得某个类或某个对象所对应的Class对象的常用的3种方式:
a. 使用Class类的静态方法forName:

Class.forName("java.lang.String");

b. 使用类的.class语法:

String.class;

c. 使用对象的getClass()方法:

String s = "aa";
Class<?> clazz = s.getClass();

下面写一个程序来用以下这些API吧:

若想通过类的不带参数的构造方法来生成对象,我们有两种方式:

  • 先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可:
    Class<?>classType = String.class;
    Object obj = classType.newInstance();
  • 先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成:
    Class<?>classType = Customer.class;
    Constructor cons = classType.getConstructor(new Class[]{});
    Object obj = cons.newInstance(new Object[]{});

若想通过类的带参的构造方法生成对象,只能使用下面的这一种方式:

  • Class<?>classType = Customer.class;
    Constructor cons = classType.getConstructor(new Class[]{String.class,int.class});
    Object obj = cons.newInstance(new Object[]{"hello",3});
实例中的经典应用
  1. 得到某个对象的属性
  2. 得到某个类的静态属性
  3. 执行某对象的方法
  4. 执行某个类的静态方法
  5. 新建实例
  6. 判断是否为某个类的实例
  7. 得到数组的某个元素
代理

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

*在某些情况下,一个客户不想或不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

代理模式一般涉及到的角色有:
*抽象角色
*代理角色
*真实角色

java的动态代理位于java.lang.reflect包下,一般主要涉及到以下两个类

  • interface InvocationHandler:该接口中仅定义了一个方法
    -public object invoke(Object obj,Method method,Object[] args)

  • Proxy:该类即为动态代理类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容