JAVA中都是对象,因此即便是我们用的类也应该是一个类的对象,这个类就是Class,即类类型.java.lang.Class
一. 类加载时机
编译时静态加载类
1) new 创建对象是静态加载类 编译时刻就需要加载所有可能使用到类
2) 但是需求可能是按需加载.同时全部加载太耗费资源. 同时接收的时候用一个通用接口 eg:office这个接口,,Word Excel 继承.那么通过反射就能接收.
功能性类尽量使用动态加载 减少编译,只用添加新写的类满足接口即可
Note:每个类加载只有一个,并不像普通对象可以有多个.
生成类类型/通过类类型生成类
package MVCTest;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*
* 万事万物皆对象
* 所有的类都是Class的对象(那Class是谁的对象?算了...)
* Class 为类类型
* 那有了类就有生成对象即生成Class类的对象
*
*/
public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
// TODO Auto-generated method stub
Test t = new Test();
Class c1 = Test.class;//根据类对象获得Class类
Class c2 = t.getClass();//根据实例对象获得Lcass类
Class c3 = Class.forName("MVCTest.Test");//静态方法通过全部路径获得
Test tt = (Test)c3.newInstance();//生成类的对象
System.out.println(c1==c2);
System.out.println(c2==c3);//都是True,一个类只有一个
getMethod(new String("hello"));//获取方法信息
getField(new String("hello"));//获取成员信息
getConstructor(new String("hello"));//获取构造函数信息
}
private static void getMethod(Object obj) {
//
Class c4 = obj.getClass();
Method [] method = c4.getMethods();
for(Method m:method){
//getReturnType()是类类型名 即int.class
System.out.print(m.getReturnType().getName()+" "+m.getName()+"(");
Class [] cc = m.getParameterTypes();
for(Class ccc:cc){
System.out.print(ccc.getName()+",");
}
System.out.println(")");
}
}
private static void getConstructor(Object obj) {
//传的参数obj类型就是自己本身的类型,只不过用父类接收
Class c4 = obj.getClass();
Constructor [] constructor = c4.getDeclaredConstructors();
for(Constructor c:constructor){
//getReturnType()是类类型名 即int.class
System.out.print(c.getName()+"(");
Class [] cc = c.getParameterTypes();
for(Class ccc:cc){
System.out.print(ccc.getName()+",");
}
System.out.println(")");
}
}
private static void getField(Object obj) {
//获取方法信息
Class c4 = obj.getClass();
Field [] field = c4.getDeclaredFields();
for(Field f:field){
//getReturnType()是类类型名 即int.class
System.out.println(f.getType().getName()+" "+" "+f.getName());
}
}
}
原文:http://blog.csdn.net/gg_gogoing/article/details/44827889