java反射机制

什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Java反射机制主要提供的功能?
在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

类的加载:
java反射机制是围绕Class类展开的,在深入java反射原理之前,需要对类加载机制有一个大致的了解。jvm使用ClassLoader将字节码文件(class文件)加载到方法区内存中:
Class clazz = ClassLoader.getSystemClassLoader().loadClass(“com.mypackage.MyClass”);
可见ClassLoader根据类的完全限定名加载类并返回了一个Class对象,而java反射的所有起源都是从这个class类开始的。

类对象:
每一个类都有一个class对象,(编写并且编译一个新类的时候就会产生一个class对象,被保存在.class文件里面),由JVM的类加载器负责生成,当创建第一个类的成员引用的时候,就会加载这个类(这说明构造方法也是静态的),java程序在它开始运行之前并非被完全加载,其每个部分只有在需要的时候才会被加载(动态加载)。类加载器首先检查Class对象是否被加载进内存,如果没有,那么默认的类加载器就会根据类名查找.class文件,在这个类的字节码被加载的时候,还会进行验证。

获取Class对象的三种方式:
1 Object ——> getClass();
2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
3 通过Class类的静态方法:forName(String className)(常用)

例子:

public class test {
	public static void main(String[] args)
			throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
		Class userclass = Class.forName("Test.FansheUser");// 获得class对象的三种方法(一定要是正确的路径)获取class对象的引用
		/*
		 * Fansheuserclass userclass=new Fansheuserclass(); Class userclass =
		 * userclass.getClass(); Class userclass = Fansheuserclass.class;
		 */
		System.out.println(userclass.getName());
		// Constructor[] c = userclass.getConstructors();// 获取所有公有构造方法
		// Constructor[] c1 = userclass.getDeclaredConstructors();// 获取所有构造方法
  userclass.newInstance();//返回确切的类型
		Constructor o = userclass.getConstructor(null);// 获取无参构造
		// Constructor c2 = userclass.getDeclaredConstructor(char.class);//
		// 获取私有构造方法(参数是char类型的)
		o.setAccessible(true);// 暴力访问(忽略访问修饰符)
		FansheUser u = (FansheUser) o.newInstance();// 用构造方法来构造新的实例(如果是有参构造可以传入参数)
		u.getName("");
		// Field[] f = userclass.getFields();// 获取所有的公有字段
		// Field[] f1 = userclass.getDeclaredFields();// 获取所有的字段
		// Field f2 = userclass.getDeclaredField("name");// 获取字段name
		Field f3 = userclass.getDeclaredField("name");// 获取公有字段name
		f3.setAccessible(true);// 解除限制,暴力设置
		f3.set(u, "刘德华");// 为object设置属性(需要object对象)
		System.out.println(f3.get(u));

		// Method[] m = userclass.getMethods();// 获取公有方法
		// Method[] m1 = userclass.getDeclaredMethods();// 获取所有方法
		Method m2 = userclass.getMethod("getName", String.class);// 获取指定的公有方法
		// Method m3 = userclass.getDeclaredMethod("getName", String.class);//
		// 获取指定的所有方法(private,public,default)
		m2.setAccessible(true);
		m2.invoke(u, "i am userclass");// 参数(实例,参数)

	}

}

interface user {
	abstract void getName(String s);
}

class FansheUser implements user {
	private String name = "tom";

	public FansheUser() {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public void getName(String s) {
		// TODO Auto-generated method stub
		System.out.println(name + ":" + s);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值