您的位置:首页 > 其它

反射机制的简单使用

2016-07-17 22:17 239 查看
从7月11号开始了在公司的实习生活,以新的状态开始面对工作。因为整个暑假都是进行培训,所以从这一篇开始,我将记录我的学习笔记。

在开始写框架之前,有一个非常重要的知识点将贯穿整个项目--反射机制。掌握了它,整个项目将变得非常轻松

1、什么是反射机制?

标准的定义我就不粘贴了,按我的理解便是:在运行时,可以通过一个类名去获取这个的相关信息,包括其构造函数、方法信息、成员变量信息,并使用这些信息(改变成员变量的值、执行方法等)。

那为什么会有这个机制的出现?它的应用场景是什么呢?在开发中,我们可能通过网络或者文件等形式得到类名,在运行时才清楚要实例化哪个类,这就是反射机制的应用场景之一。

2、如何使用

第一步:得到类的Class对象。

<span style="font-family:Microsoft YaHei;font-size:18px;">//第一种,调用Class的静态方法
Class c=Class.forName(“className”);
//第二种,.class语法
Class c=String.class;
//第三种
String str="";
Class c=str.getClass();
</span>

第二步:通过Class对象获取类的相关信息。

主要讲一下几个需要注意的地方

a、getMethod(String name,Class<?>...
parameterTypes)可以获得此 Class 对象所表示的类或接口的指定公共成员方法。而getDeclaredMethod(String name,Class<?>...
parameterTypes)方法可以获得此 Class 对象所表示的类或接口的指定成员方法,包括私有方法。

b、上面两个方法中,第一参数name表示所要获得方法名,第二是一个可变长参数,即参数的个数不定,参数含义是方法的形参类型class对象。

c、上述方法的返回对象是Method类型,若要执行这个方法还要调用其invoke()。同样的,这个invoke()有两个参数,第一个参数代表这个类的实例对象引用。第二参数仍然是可变长参数,代表这个方法所需要的实参。

d、若Method对象所代表的是一个私有对象,则加上.setAccessible(true)

d、其他具体的应该查看API文档,越发觉得是个好东西。

<pre name="code" class="java">package com.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

//功能:测试案例以及学习jdk源码

public class test {
public static void main(String args[]){
try {
Class c=Class.forName("com.test.User");//一定要类的全名,比如"java.lang.String"
User u=(User) c.newInstance();//得到这个类的一个实例对象
//可变长参数
Method m1=c.getMethod("init", String.class,int.class);//第二个参数代表参数类型
m1.invoke(u,"Lucy",2);//第二个参数代表要传入的实参

//私有方法
Method m2=c.getDeclaredMethod("display",null);
m2.setAccessible(true);//关键,访问私有方法一定要有
m2.invoke(u, null);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}

}
}

class User {
public String name;
public int age;
public void init(String name,int age){
this.name=name;
this.age=age;
}

private void display(){
System.out.println("name="+name+",age="+age);
}

}




以上。(PS:整理的比较简单,了解的也不深)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: