注解和反射是Java中间件开发时必须用到的技术,比如最流行的SSM框架中都会用到注解和反射,所以在这里将自己学习的心得记录一下。
适用于有一定面向对象基础的同学看!
Java的类加载机制
为了更好的理解注解和反射,必须对jvm的类加载机制有一定的了解。一个类的加载包括以下步骤
- 编译:Java编译器将.java文件编译为.class字节码文件,.class文件中是二进制的字节码,人们是看不懂的,是给jvm虚拟机读取的;
- 加载类:jvm读取到字节码文件以后,会将文件中类的信息加载到内存中的方法区,方法区中只保存类中的静态变量,静态方法,静态块,和一些其他的变量。同时jvm会在堆中生成一个class对象,这个对象就是指向该类的,其中包含了这个类的全部信息,你可以使用这个class对象生成这个类的新实例,或者得到它的方法,属性等等,总之一个类的所有信息都能在class对象中找到。
反射
反射就是我们使用代码得到一个类的class对象,使用此对象操作一个类,这样就可以在程序运行时动态的创建对象了
代码如下:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 应用反射的API,获取类的信息(类的名字、属性、方法、构造器等)
* @author
*
*/
public class Demo02 {
public static void main(String[] args) {
String path = "User";
try {
Class clazz = Class.forName(path);
//获取类的名字
System.out.println(clazz.getName());//获得包名+类名:com.bjsxt.test.bean.User
System.out.println(clazz.getSimpleName()); //获的类名:User
//获取属性信息
// Field[] fields = clazz.getFields(); //只能获得public的field
Field[] fields = clazz.getDeclaredFields();//获得所有的field
Field f = clazz.getDeclaredField("uname");
System.out.println(fields.length);
for(Field temp:fields){
System.out.println("属性:"+temp);
}
//获取方法信息
Method[] methods = clazz.getDeclaredMethods();
Method m01 = clazz.getDeclaredMethod("getUname", null);
//如果方法有参,则必须传递参数类型对应的class对象
Method m02 = clazz.getDeclaredMethod("setUname", String.class);
for(Method m:methods){
System.out.println("方法:"+m);
}
//获得构造器信息
Constructor[] constructors = clazz.getDeclaredConstructors();
Constructor c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
System.out.println("获得构造器:"+c);
for(Constructor temp:constructors){
System.out.println("构造器:"+temp);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
上面的代码中使用的Class.forName()来获得的class对象,这是最常用的方法,还有一些其他的方法,比如:
Class clazz=String.class//直接通过类名来获取class对象
Class clazz="123".getClass()//通过对象的getClass()方法获得clas对象
注解
注解可以理解为我们为jvm做的解释,类似于注释,只不过注释是为开发者服务的,注解是为jvm服务的。
https://josh-persistence.iteye.com/blog/2226493