java实现反射

1.什么是java反射

java反射是一种能够在项目运行时,知道任意一个类的属性方法并能够调用他们。

2.反射的优缺点

优点:反射机制可以实现动态创建对象和编译

缺点:性能影响,使用反射基本是一种解释操作,解释操作慢于直接执行

3.java中获取class对象的四种方法

Ⅰ、通过class类静态方法 forname

class c = class.forName("name");

Ⅱ、通过object类的getClass方法

String a = "123";
Class c = a.getClass();

Ⅲ、如果T是 一个已定义类型的话,在java中可以通过 .class获取

Student s = new Student();
class c = s.class;
class d = int.class;
Ⅳ、运用primitive wrapper classes的TYPE语法

Class c = Integer.TYPE;
Class d = Double.TYPE;

4.demo(如下)

student 类

import java.util.Date;

public class Student {
	private String studentID;
	public String studentName;
	private Date birthday;
	private int score;

	public String getStudentID() {
		return studentID;
	}

	public void setStudentID(String studentID) {
		this.studentID = studentID;
	}

	public String getStudentName() {
		return studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}

	public void finishTask(String taskName) {
		System.out.println(studentName + "完成了" + taskName + "作业");
	}
}

ReflectStudentTest1测试类

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectStudentTest1 {
	public static void main(String[] args) {
		try {
			// 获取Student的Class对象
			//Class<?> clazz = Class.forName("com.hdw.Student");
			//Class<?> clazz = Student.class;
			Class<?> clazz = new Student().getClass();
			// 获取该类中所有的属性
			Field[] fields = clazz.getDeclaredFields();
			// 遍历所有的属性
			for (Field field : fields) {
				// 打印属性信息,包括访问控制修饰符,类型及属性名
				System.out.println(field);
				System.out.println("修饰符:" + Modifier.toString(field.getModifiers()));
				System.out.println("类型:" + field.getType());
				System.out.println("属性名:" + field.getName());
			}
			// 获取该类中的所有方法
			Method[] methods = clazz.getDeclaredMethods();
			for (Method method : methods) {
				// 打印方法签名
				System.out.println(method);
				System.out.println("修饰符:"
						+ Modifier.toString(method.getModifiers()));
				System.out.println("方法名:" + method.getName());
				System.out.println("返回类型:" + method.getReturnType());
				// 获取方法的参数对象
				Class<?>[] clazzes = method.getParameterTypes();
				for (Class<?> class1 : clazzes) {
					System.out.println("参数类型:" + class1);
				}
			}

			// 通过Class对象创建实例
			Student student = (Student) clazz.newInstance();
			// 获取属性名为studentName的字段(Field)对象,以便下边重新设置它的值
			Field studentName = clazz.getField("studentName");
			// 设置studentName的值为”张三“
			studentName.set(student, "张三");
			// 通过Class对象获取名为”finishTask“,参数类型为String的方法(Method)对象
			Method finishTask = clazz.getMethod("finishTask", String.class);
			// 调用finishTask方法
			finishTask.invoke(student, "数学"); 
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}

参见:

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java反射机制来动态生成枚举类。下面是一个示例代码: ```java import java.lang.reflect.Constructor; public class EnumReflectionExample { public static void main(String[] args) throws Exception { // 枚举类名 String enumClassName = "com.example.EnumExample"; // 枚举常量名称 String constantName = "VALUE3"; // 新的枚举常量值 Object[] newEnumConstants = { "New Value 3" }; // 获取原始枚举类对象 Class<?> enumClass = Class.forName(enumClassName); Object[] enumConstants = enumClass.getEnumConstants(); // 创建新的枚举类数组,长度比原始数组多1 Object[] newEnumValues = new Object[enumConstants.length + 1]; System.arraycopy(enumConstants, 0, newEnumValues, 0, enumConstants.length); // 创建新的枚举常量对象 Class<?>[] paramTypes = { String.class, int.class }; Constructor<?> constructor = enumClass.getDeclaredConstructor(paramTypes); constructor.setAccessible(true); Object newEnumConstant = constructor.newInstance(constantName, newEnumConstants.length); newEnumValues[newEnumConstants.length] = newEnumConstant; // 更新枚举常量值 Field valuesField = enumClass.getDeclaredField("$VALUES"); valuesField.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(valuesField, valuesField.getModifiers() & ~Modifier.FINAL); valuesField.set(null, newEnumValues); // 输出更新后的枚举常量值 for (Object constant : enumClass.getEnumConstants()) { System.out.println(constant); } } } ``` 这个示例中,我们首先通过Class.forName()方法获取到原始的枚举类对象。然后,我们创建一个新的枚举常量数组,将原始的枚举常量值复制到新数组中。接下来,我们使用反射来创建一个新的枚举常量对象,并将其添加到新的枚举常量数组中。最后,我们使用反射来更新枚举类的私有静态字段"$VALUES"的值,将其替换为新的枚举常量数组。 请注意,这种动态生成枚举类的方法并不是Java语言本身提供的,而是使用了反射机制来实现的。因此,在使用时需要谨慎考虑其适用性和可能带来的潜在问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值