反射的简单使用

查考文章
整理Java反射常用方法 https://blog.csdn.net/github_35180164/article/details/52037112
深入解析Java反射(1) - 基础 https://www.sczyh30.com/posts/Java/java-reflection-1/

反射是什么

反射:允许任意一个类在运行时获取自身的类信息,并且可以操作这个类的方法和属性。这种动态获取类信息和动态调用对象方法的功能称为Java的反射机制。

为什么要用反射

通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。

反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁

反射可以降低程序耦合性,提高程序的灵活性

反射常用类

  • java.lang.reflect.Constructor<T> :与构造函数相关的反射
  • java.lang.reflect.Field :与字段相关的反射
  • java.lang.reflect.Method :与方法相关的反射
  • java.lang.reflect.Modifier :与修饰符相关的反射

反射常用方法

  • Field相关

    • Class.getDeclaredFields() : 获取当前类所有的(包括私有)字段
    • Class.getDeclaredField(String) : 获取单个字段(包括私有)
    • Class.getFields() : 获取当前类所有的(不包括私有)字段
    • Class.getField(String) : 获取单个字段(不包括私有)
  • Method相关

    • Class.getDeclaredMethods() : 获取类本身的所有方法,包括公有、保护、私有
    • Class.getDeclaredMethod(String, Class[]) : 获取类本身的指定方法,包括公有、保护、私有
    • Class.getMethods() : 获取类本身和其所有父类的公有和保护方法
    • Class.getMethod(String, Class[]) : 获取类本身和其所有父类指定的公有和保护方法

反射的运用

  • 测试 user 类
	public class User {
   
		private String username;
		private String password;
	
		public User() {
   
			super();
		}
	
		public User(String username, String password) {
   
			super();
			this.username = username;
			this.password = password;
		}
	
		public String getUsername() {
   
			return username;
		}
	
		public void setUsername(String username) {
   
			this.username = username;
		}
	
		public String getPassword() {
   
			return password;
		}
	
		public void setPassword(String password) {
   
			this.password = password;
		}
	
		private String privateMethod(String str) {
   
			return "这是调用私有方法:" + str;
		}
	
		@Override
		public String toString() {
   
			return "User [username=" + username + ", password=" + password + "]";
		} 
	}

获得 Class 对象三种方法

  1. 使用 Class.forName 静态方法:
	public static Class<?> forName(String className)

例如:

	try {
   
		Class<?> userClass = Class.forName("com.test.User");
	} catch (ClassNotFoundException e) {
    
		e.printStackTrace();
	} 
  1. 调用对象的 class
	Class<?> userClass = User.class;
  1. 调用某个对象的 getClass() 方法
	User user = new User();
	Class<? extends User> userClass = user.getClass(); 

创建对象实例

	@Test
	public void run(){
    
		try {
   
			Class<?> userClass = Class.forName("com.test.User");
			
			// 直接使用Class.newInstance()方法来创建Class对象的无参构造生成实例对象
			User user1 = (User) userClass.newInstance();
			user1.setUsername("小茗");
			user1.setPassword("123ABC");
			System.out.println("无参构造生成实例对象: " + user1.toString());
 
			// 使用 java.lang.reflect.Constructor 类生成有参构造生成实例对象
			// getConstructor(Class... arg0) 参数为Java的可变参数 传入类型为 java.lang.Class 类型
			Constructor<?> constructor = userClass.getConstructor(String.class, String.class);
			User user2 = (User) constructor.newInstance("小黄", "ABC123");
			System.out.println("有参构造生成实例对象 : " + user2.toString());

		} catch (ClassNotFoundException e
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值