Java 反射机制和运行原理

有了一些小成绩就不求上进,这完全不符合我的性格。攀登上一个阶梯,这固然很好,只要还有力气,那就意味着必须再继续前进一步 。

每天进步一点,加油 ! 😄

反射机制运行原理:

​ 1. Jvm 扫描 java文件,读取文件的信息(构造,属性,方法,实现的接口…)

​ 2. 将读取的信息保存在一个 类对象( java.lang.Class 包的对象)

​ 3. 通过类对象的 newInstance 方法获得对象.

使用步骤:

1. 首先通过 `Class.forName(“全限定名”);`

2. 接收返回的类的对象 `Class` 变量名 = `Class.forName(“全限定名”);`

3. Object`  变量名= `变量名.newInstance();`(反射)返回一个实例对象 `Object` 类型	

获得类对象的三种方式:

​ 1. Class.forName(“全限定名”);

​ 2. 类.class

​ 3. 对象.getClass();

首先得再项目工程里创建实体类,如下图:

在这里插入图片描述

方式一:

​ 使用 全限定名,获取类对象

代码如下:

package com.to.demo;

import com.to.entity.zj_articles;

/**
 * 
 * Test refle Mechanism Demo1
 * 
 * @author To be happy oh
 *
 */
public class demo1 {
	
	/**
	 * @param args  参数
	 * @throws Exception  这里的话就使用异常抛出了,实际开发中,必须使用异常处理
	 */
	public static void main(String[] args) throws Exception {
		
		// 1、 获取类对象
		Class<?> zj = Class.forName("com.to.entity.zj_articles");
		
		// 2、实例化对象,这里需要给对象进行强制转换
		zj_articles newInstance = (zj_articles) zj.newInstance();
		
		// 3、输出对象信息
		System.out.println(newInstance);
	}

}

控制台如下:
在这里插入图片描述

在这里插入图片描述

哈哈 但这里并没有对象信息

方式二:

​ 可直接通过 类名称 点出类对象

代码如下:

package com.to.demo;

import com.to.entity.zj_articles;

/**
 * 
 * Test refle Mechanism Demo2
 * 
 * @author To be happy oh
 *
 */
public class demo2 {

	/**
	 * @param args 参数
	 * @throws Exception 这里的话就使用异常抛出了,实际开发中,必须使用异常处理
	 */
	public static void main(String[] args) throws Exception {

		// 1、获取 object 对象
		Class<zj_articles> className = zj_articles.class;
		
		// 2、实例化对象,这里需要给对象进行强制转换
		zj_articles newInstance = (zj_articles) className.newInstance();
		
		// 3、输出对象信息,哈哈 但这里并没有对象信息
		System.out.println(newInstance);
	}
}
方式三:

​ 想要通过 对象,获取类对象

代码如下:

package com.to.demo;

import com.to.entity.zj_articles;

/**
 * 
 * Test refle Mechanism Demo3
 * 
 * @author To be happy oh
 *
 */
public class demo3 {

	/**
	 * @param args 参数
	 * @throws Exception 这里的话就使用异常抛出了,实际开发中,必须使用异常处理
	 */
	public static void main(String[] args) throws Exception {
		
		// 1、实例化一个对象,储存堆(元空间) 里
		zj_articles zj = new zj_articles();

		// 2、获取 object 对象
		Class<? extends zj_articles> obj = zj.getClass();
		
		// 3、实例化对象,这里需要给对象进行强制转换
		zj_articles newInstance = (zj_articles) obj.newInstance();
		
		// 4、输出对象信息,哈哈 但这里并没有对象信息
		System.out.println(newInstance);
	}
}

通过类对象可以获得类中的所有属性对象

代码如下:

package com.to.demo;

import java.lang.reflect.Field;
import java.util.Arrays;

import com.to.entity.zj_articles;

/**
 * 
 * Test refle Mechanism Get Property . . .
 * 
 * @author To be happy oh
 *
 */
public class demo4 {

	/**
	 * @param args 参数
	 * @throws Exception 这里的话就使用异常抛出了,实际开发中,必须使用异常处理
	 */
	public static void main(String[] args) throws Exception {
		
		// 1、实例化一个对象,储存堆(元空间) 里
		zj_articles zj = new zj_articles();

		// 2、获取 object 对象
		Class<? extends zj_articles> obj = zj.getClass();
		
		// 4、获取所有公开的属性集合
		Field[] fields = obj.getFields();
		
		System.out.println(Arrays.toString(fields));
		
		// 5、指定获取公开的属性
		Field BQ = obj.getField("BQ");
		
		System.out.println(BQ);
		
		// 6、获取所有私有属性集合
		Field[] DeclaredFields = obj.getDeclaredFields();
		
		System.out.println(Arrays.toString(DeclaredFields));
		
		// 7、获取私有属性
		Field article_id = obj.getDeclaredField("article_id");
		
		System.out.println(article_id);
	}
}

反射给对象赋值:

代码如下:

package com.to.demo;

import java.util.Date;

import com.to.entity.zj_articles;

/**
 * 
 * Test refle Mechanism Demo5
 * 
 * @author To be happy oh
 *
 */
public class demo5 {
	
	/**
	 * @param args  参数
	 * @throws Exception  这里的话就使用异常抛出了,实际开发中,必须使用异常处理
	 */
	public static void main(String[] args) throws Exception {
		
		// 1、 获取类对象
		Class<?> obj = Class.forName("com.to.entity.zj_articles");
		
		// 2、实例化对象,这里需要给对象进行强制转换
		zj_articles zj = (zj_articles) obj.newInstance();
		
		
		// 3、属性赋值
		zj.setArticle_id(1); // 设置 ID
		zj.setArticle_date(new Date(System.currentTimeMillis())); // 设置时间

		
		// 4、输出对象信息
		System.out.println(zj);
	}

}

控制台如下:

在这里插入图片描述

反射去给对象值:

代码如下:

package com.to.demo;

import java.lang.reflect.Field;

/**
 * 
 * Test refle Mechanism Demo6
 * 
 * @author To be happy oh
 *
 */
public class demo6 {
	
	/**
	 * @param args  参数
	 * @throws Exception  这里的话就使用异常抛出了,实际开发中,必须使用异常处理
	 */
	public static void main(String[] args) throws Exception {
		
		// 1、 获取类对象
		Class<?> obj = Class.forName("com.to.entity.zj_articles");
		
		// 2、实例化对象
		Object newInstance = obj.newInstance();
		
		// 3、使用  Field 获取共有属性方法,DeclaredField 获取私有属性方法
		Field article_id = obj.getDeclaredField("article_id"); // 私有属性
		Field BQ = obj.getField("BQ"); // 共有属性
		
		
		// 4、注意这一点,私有属性必须要解锁
		article_id.setAccessible(true);
		BQ.setAccessible(true);
		
		
		// 5、设置属性值
		article_id.set(newInstance, 1);
		BQ.set(newInstance, "Java");

		
		// 6、使用属性获取值
		int Id = (Integer)article_id.get(newInstance);
		String bq = (String)BQ.get(newInstance);
		
		System.out.println(Id);
		System.out.println(bq);
	}

}

获得构造方法

package com.to.demo;

import java.lang.reflect.Constructor;
import java.util.Arrays;

/**
 * 
 * Test refle Mechanism Demo1
 * 
 * @author To be happy oh
 *
 */
public class demo7 {
	
	/**
	 * @param args  参数
	 * @throws Exception  这里的话就使用异常抛出了,实际开发中,必须使用异常处理
	 */
	public static void main(String[] args) throws Exception {
		
		// 1、 获取类对象
		Class<?> zj = Class.forName("com.to.entity.zj_articles");
		
		
		// 2、获取所有公开构造方法
		Constructor<?>[] constructors = zj.getConstructors();
		
		System.out.println(Arrays.toString(constructors));
		
		
		// 3、指定参数获取公开构造方法
		Constructor<?> constructor = zj.getConstructor(String.class);
		
		System.out.println(constructor);
		
		
		// 4、获取所有私有构造方法
		Constructor<?>[] declaredConstructors = zj.getDeclaredConstructors();
		
		System.out.println(Arrays.toString(declaredConstructors));
		
		
		// 5、指定获取私有构造方法
		Constructor<?> declaredConstructor = zj.getDeclaredConstructor(String.class,int.class);
	
		System.out.println(declaredConstructor);
		
	}

注意事项:

​ 如果构造器是访问受限的,那么需要先调用 cons.setAccessable(true);

获得方法

package com.to.demo;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

import com.to.entity.zj_articles;

/**
* 
* Test refle Mechanism Demo1
* 
* @author To be happy oh
*
*/
public class demo8 {

   /**
    * @param args 参数
    * @throws Exception 这里的话就使用异常抛出了,实际开发中,必须使用异常处理
    */
   public static void main(String[] args) throws Exception {

   	// 1、 获取类对象
   	Class<?> zj = Class.forName("com.to.entity.zj_articles");
   	
   	
   	// 2 、实例化
   	Object newInstance = zj.newInstance();

   	// 3.、获得可以访问的方法(包括父类方法)
   	Method[] methods = zj.getMethods();

   	System.out.println(Arrays.toString(methods));

   	// 4、指定获取可以访问方法
   	Method method = zj.getMethod("demo");

   	System.out.println(method);

   	// 5、获得声明在本类中的所有方法
   	Method[] declaredMethods = zj.getDeclaredMethods();

   	System.out.println(Arrays.toString(declaredMethods));

   	// 6、指定获取可以访问方法
   	Method DeclaredMethod = zj.getDeclaredMethod("demo");

   	System.out.println(DeclaredMethod);

   	
   	// 7、执行方法
   	method.invoke(newInstance);
   	
   	// 8、获取修饰符
   	String Modifiers = Modifier.toString(method.getModifiers());
   	
   	System.out.println(Modifiers);
   	
   	// 9、获取返回值类型
   	Class<?> returnType = method.getReturnType();
   	
   	System.out.println(returnType);
   	
   	// 10、获得参数列表的类型的类对象
   	Class<?>[] parameterTypes = method.getParameterTypes();
   	
   	System.out.println(Arrays.toString(parameterTypes));
   }

}

源代码:

GitHub 地址:https://github.com/MrLi12/reflect

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值