您的位置:首页 > 编程语言 > Java开发

java的反射机制

2015-07-27 12:14 302 查看
在学习之前,先来看看百度百科是怎么解释它的吧:

什么是java的反射:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

java的反射能够做什么:

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

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

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

在运行时调用任意一个对象的方法;生成动态代理。

反射类的属性、构造方法、父类、接口和方法

java的反射的用法:

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

public class test {

public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

demo1 demo = new demo1();
Class a = demo.getClass();

//取得demo的out 方法
Method method = a.getMethod("out");
//		System.out.println(method.toString() + "");
//反射输出 out()
//		method.invoke(demo,null);

//获得demo1的所有方法,包括父类的方法
Method[] m = a.getMethods();

//		for(int i = 0 ;i < m.length ; i++){
//			System.out.println(m[i].toString() + "");
//		}

//
Method[] me = a.getDeclaredMethods();

//		for(int i = 0 ;i < me.length ; i++){
//			System.out.println(me[i].toString() + "");
//		}

Class b = demo1.class;

try {
Class c = Class.forName("test.demo1");
demo1 object = (demo1)c.newInstance();
object.out();
Method[] method1 = a.getDeclaredMethods();

for(int i = 0 ;i < method1.length ; i++){
System.out.println(method1[i].toString() + "");
}

//获得构造函数
Constructor[] theConstructors = c.getConstructors();
System.out.println("构造函数的数量:" + theConstructors.length );

//获得类的所有公共的屬性
Field[] fb =c.getFields();
for ( int  j= 0 ;j<fb.length;j++){
Class cl = fb[j].getType();
System.out.println("fb:" +cl);
}

System.out.println("反射类中所有的属性" );
Field[] fa = c.getDeclaredFields();
for ( int  j= 0 ;j<fa.length;j++){
String cl = fa[j].getName();
System.out.println("fa:" +cl);
}

System.out.println("反射类中私有属性的值" );
Field f = c.getDeclaredField("b");
f.setAccessible(true );
Integer i = (Integer)f.get(object);
System.out.println(i);

} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

class demo1 {

public demo1(){

}

public int a = 1;
private int b = 2;

public void out() {
System.out.println("out。。。");
}

public void init(){
System.out.println("a = " + a);
}
}


详细用法 ,代码中有注释。我们可以通过反射来获取某个类的变量,方法,构造函数等信息;

比如我们在开发Android的时候 ,在就得api中是不包含某个函数的,所以 我们可以通过反射机制,在运行的过程中 查找是否含有这个方法。

如果我们想访问某个类的私有变量,也可以用反射获得。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: