在学习之前,先来看看百度百科是怎么解释它的吧:
什么是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中是不包含某个函数的,所以 我们可以通过反射机制,在运行的过程中 查找是否含有这个方法。
如果我们想访问某个类的私有变量,也可以用反射获得。