Java学习笔记(10)--注解与反射

注解和反射是Java中间件开发时必须用到的技术,比如最流行的SSM框架中都会用到注解和反射,所以在这里将自己学习的心得记录一下。
适用于有一定面向对象基础的同学看!

Java的类加载机制

为了更好的理解注解和反射,必须对jvm的类加载机制有一定的了解。一个类的加载包括以下步骤

  1. 编译:Java编译器将.java文件编译为.class字节码文件,.class文件中是二进制的字节码,人们是看不懂的,是给jvm虚拟机读取的;
  2. 加载类: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值