1、反射的基本概念
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2、反射的基本功能
- 可以通过反射取得一个类的实例化对象。
- 可以通过反射取得类的结构
- 可以通过反射进行属性方法的调用
3、认识反射
正常情况下,一个类要想使用,则必须找到此类,之后通过此类产生实例化对象,必须先有类再有对象,那么如果现在要想通过一个对象找到其所在的类呢?在反射机制中Class类是一个操作的源头,所有的反射操作从此类展开,但是如果想要实例化此类对象可以通过以下三个途径完成:
- 通过Object类中的getClass方法: public final Class<?> getClass();
- 通过类.class的形式:Person.class
- 通过类的静态方法:public static calss<?> forName(StringclassName) throws ClassNotFoundException
最常用的是forName方法,其次是类class方法。在Class的使用中实例化对象是最常用的一种操作,而且日后所有的框架的各个程序的实现原理都是依靠Class类完成的。为了开发方便,一定在类中定义无参构造方法。
public class PersonClassDemo {
//.class方法
public static void main(String[] args) {
Person p1=new Person();
Class<Person> c=(Class<Person>) p1.getClass();
System.out.println(c.getName());//返回对象为包名.person
}
}
public class PersonClassDemo3 {
//验证forName方法
public static void main(String[] args) {
Class<?> c=null;
try {
c = Class.forName("prc.demo1.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(c.getName());
}
}
4、通过反射实例化属性和方法
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class getMethodsDemo1 {
public static void main(String[] args)throws Exception {
Class<?> c=Class.forName("prc.demo2.Person");
System.out.println("------------取得类中所有普通方法名-----------");
Method m[]=c.getMethods();
for (int i = 0; i < m.length; i++) {
System.out.println(m[i]);
}
System.out.println("------------取得类中所有接口-----------");
Class<?> inter[]=c.getInterfaces();
for (int i = 0; i < inter.length; i++) {
System.out.println(inter[i].getName());
}
System.out.println("------------取得类中所有父类-----------");
Class<?> sc=c.getSuperclass();
System.out.println(sc.getName());
System.out.println("------------取得类中所有构造器-----------");
Constructor<?> con[]=c.getConstructors();
for (int i = 0; i < con.length; i++) {
int mod=con[i].getModifiers();
String str=Modifier.toString(mod);
Class<?>[] parm=con[i].getParameterTypes();
System.out.print(str+" ");
System.out.print(con[i].getName()+"(");
for (int j = 0; j < parm.length; j++) {
System.out.print(parm[j].getName()+","+"arg-"+j);
}
System.out.println(")");
}
System.out.println("------------取得返回值类型、异常、方法名-----------");
for(int i=0;i<m.length;i++){
String mod=Modifier.toString(m[i].getModifiers());//取得访问权限
String metName=m[i].getName(); //取得方法名
Class<?> ret=m[i].getReturnType();//取得返回值类型
Class<?> exc[]=m[i].getExceptionTypes();//取得全部异常
Class<?> parm[]=m[i].getParameterTypes();
System.out.print(mod+" ");
System.out.print(ret+" ");
System.out.print(metName+" ");
for (int j = 0; j < parm.length; j++) {
System.out.print(parm[j]+"arg-"+j);
if(j<parm.length-1){
System.out.print(",");
}
}
}
System.out.println("------------取得全部变量-----------");
Field []f=c.getFields(); //取得全部变量
for (int i = 0; i < f.length; i++) {
String mo=Modifier.toString(f[i].getModifiers());
System.out.println(mo);
System.out.println(f[i].getType().getName());
}
}
}