Java反射机制

Java反射机制

通过Java反射机制,可以访问已经装载在JVM中的Java对象,实现访问、检测和修改Java对象,Java反射机制对于任意一个Jva对象,都能够调用它的任意一个方法和属性,这种动态 获取的信息以及动态调用对象的方法的功能。首先准备一个类,然后再通过反射来反射里面的信息。
准备的类:

public class ReflectClass {
	
	private int int1;
	private int int2;
	
	//无参构造器
	public ReflectClass() {
		
	}
	//有参构造器
	public ReflectClass(int int1, int int2) {
		this.int1 = int1;
		this.int2 = int2;
	}
	
	//公有的方法
	public int getInt1() {
		return int1;
	}
	//公有的方法
	public int getInt2() {
		return int2;
	}
	//私有有的方法
	private void setInt1(int int1){
		this.int1 = int1;
	}
	//私有有的方法
	private void setInt2(int int2){
		this.int2 = int2;
	}
	
}

1、通过反射获取和调用构造方法:

// 加载类
		Class<?> class1 = ReflectClass.class;
		
		// 获取构造器
		//getConstructors()只能获取公有的构造器  getDeclaredConstructors();能获取所有的构造器
		Constructor<?>[] constructors = class1.getDeclaredConstructors();//
		System.out.println("构造器有:");
		for (Constructor<?> constructor : constructors) {
			StringBuilder builder =new StringBuilder();
			builder.append("\t" + Modifier.toString(constructor.getModifiers()));
			//名称
			builder.append(" " + constructor.getName().substring(constructor.getName()
					.lastIndexOf(".")+1) + "(");
			//形参列表类型
			Class<?>[] rarameterTypes=constructor.getParameterTypes();
			for (Class<?>  rarameterType  : rarameterTypes) {
				builder.append(rarameterType.getSimpleName() + ",");
			}
			builder.append(")");
			String str = builder.toString();
			str = str.replace(",)", ")");
			System.out.println(str);//输出
		}
		// 通过反射调用构造器
		System.out.println("----通过反射调用构造器赋值----");
		Constructor<?> constructor=class1.getConstructor(int.class, int.class);
		ReflectClass reflectClass = (ReflectClass) constructor.newInstance(12,22);
		System.out.println("int1="+reflectClass.getInt1()+",int2="+reflectClass.getInt2());

获取结果:
在这里插入图片描述

2、通过反射获取和调用方法:

//通过反射获取方法
		System.out.println("方法有:");
		Method[] allMethods = class1.getDeclaredMethods();
		for (int i = 0; i < allMethods.length; i++) {
			StringBuffer sBuffer = new StringBuffer();
			sBuffer.append("\t");
			sBuffer.append(i +  1);
			sBuffer.append(":");
			// 获取修饰符
			sBuffer.append(Modifier.toString(allMethods[i].getModifiers())+"  ");
			// 获取返回值类型
			sBuffer.append(allMethods[i].getReturnType().getSimpleName()+"  ");
			//获取方法名称
			sBuffer.append(allMethods[i].getName());
			sBuffer.append(" (");
			//获取参数类型
			Class<?>[] ptypes = allMethods[i].getParameterTypes();
			for (int j = 0; j < ptypes.length; j++) {
				sBuffer.append(ptypes[j].getSimpleName());
				if(j+1 != ptypes.length){
					sBuffer.append(" ");
				}
			}
			sBuffer.append(")");
			System.out.println(sBuffer.toString());
			
		}
		//通过反射调用方法
		System.out.println("---通过反射调用方法获取值----");
		Method method2=class1.getDeclaredMethod("getInt1");
		method2.setAccessible(true);
		System.out.println(method2.invoke(reflectClass));

获取结果:
在这里插入图片描述
3、通过反射获取和调用成员变量

// 获取所有的成员变量
		System.out.println("所有的成员变量");
		Field[] fields=class1.getDeclaredFields();
		for (int i = 0; i < fields.length; i++) {
			StringBuffer sBuffer= new StringBuffer();
			sBuffer.append("\t");
			sBuffer.append(i + 1);
			sBuffer.append(":");
			sBuffer.append(Modifier.toString(fields[i].getModifiers()));
			sBuffer.append("  ");
			sBuffer.append(fields[i].getType().getSimpleName());
			sBuffer.append("  ");
			sBuffer.append(fields[i].getName());
			System.out.println(sBuffer.toString());
		}
		//通过反射调用成员变量
		System.out.println("---通过反射调用成员变量获取值----");
		Field field = class1.getDeclaredField("int1");
		field.setAccessible(true);
		System.out.println(field.get(reflectClass));

获取结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值