文档章节

Java的反射机制与动态代理(一):反射

伤了心的蜻蜓在唱歌
 伤了心的蜻蜓在唱歌
发布于 2017/03/28 15:28
字数 931
阅读 8
收藏 0

    Java的反射属于高级特性内容,但是在开发中占据很重要的地位。通常我们使用类都是正向使用的,比如说创建Student类,我们想要调用类中的方法,就必须先要创建一个对象,然后用创建的对象去调用方法。而反射就是通过Class类去构造对象,不直接使用new运算符去创建对象。 如下的Student类,包含两个字段name和age,以及构造函数、私有的方法。

package com.dd171290.reflect;
public class Student {
	public String name;
	private int age;
	
	private Student() {
		name="default";
		age=20;
	}
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	/**
     *此处省略了getter和setter方法以及hashCode、toString、equals方法
    **/
	
	private int myAge(){
		return age;
	}
	
}

如何通过Class来构建Student对象呢?

使用Class.forName方法返回一个Class对象,在Class对象中封装了很多操作构造函数、字段、方法、接口等方法,具体内容如下。

(1) 先获取Class类的对象

首先,你要确定构造类所在的包,本文中Student类位于包com.dd171290.reflect中,因此在调用

static String className="";
static Class<?> student;
static{
		className="com.dd171290.reflect.Student";//构造类所在的包的路径
		try {
			student=Class.forName(className);//获取Class类的对象
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
}

(2) 如何获取Student类的实例

    /**
	 * 获取对象的实例
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public void getNewInstance() throws InstantiationException, IllegalAccessException {
		 //调用newInstance方法获取类的实例
         System.out.println(student.newInstance());
	}

(3) 获取Student类的共有构造函数

public void getPublicConstructor() throws Exception{
		System.out.println("-----获取类中公有的构造函数----");
        //获取构造函数,String.class,int.class 对应构造函数的参数类型
		Constructor<?> constructor=student.getConstructor(String.class,int.class);
		Student s1=(Student)constructor.newInstance("val",23);
		System.out.println(s1.getName());
		System.out.println(s1.getAge());
}

(4) 获取Student类的私有构造函数

public void getPriConstructor() throws Exception{
		System.out.println("-----获取类中私有的构造函数----");
        //如果私有构造函数有参数,调用方法时,传递相对应的参数类型
		Constructor<?> constructor=student.getDeclaredConstructor();
		constructor.setAccessible(true);///强制取消Java的权限检测
		Student s2=(Student) constructor.newInstance();
		System.out.println(s2.getName());
		System.out.println(s2.getAge());
	}

(5) 获取Student类公有的成员变量

public void getPubFields() throws Exception{
		System.out.println("-----获取类中公有的成员变量----");
        //现获取类的构造函数
		Constructor<?> constructor=student.getConstructor(String.class,int.class);
        //实例化类的对象
		Student s1=(Student)constructor.newInstance("val",23);
        //获取名为name的字段
		Field name=student.getField("name");
        //使用set方法,为name字段设置值,其中s1是类对象
		name.set(s1, "fv");
        //使用get方法获取字段的值
		System.out.println(name.get(s1));
	}

(6) 获取Student类私有的成员变量

public void getPriFields() throws Exception{
		System.out.println("-----获取类中私有的成员变量----");
		Constructor<?> constructor=student.getConstructor(String.class,int.class);
		Student s1=(Student)constructor.newInstance("val",23);
		Field field=student.getDeclaredField("age");//获取私有字段age
		field.setAccessible(true);// 强制获取访问权限
		field.set(s1, 30);
		System.out.println(field.get(s1));
	}

(7) 获取Student类公有方法

public void getPubMethods() throws Exception{
		System.out.println("-----获取到类中公有的方法----");
		Constructor<?> constructor=student.getConstructor(String.class,int.class);
		Student s1=(Student)constructor.newInstance("val",23);
		Method method=student.getMethod("setAge",int.class);//第一个参数 方法名,第二参数,方法的参数类型
		method.invoke(s1, 30);//s1是类的对象,30表示方法的实际参数
		System.out.println(s1.getAge());
		
	}

(8) 获取Studnet类的私有方法

public void getPriMethods() throws Exception{
		System.out.println("-----获取类中私有的方法----");
		Constructor<?> constructor=student.getConstructor(String.class,int.class);
		Student s1=(Student)constructor.newInstance("val",23);
		Method method=student.getDeclaredMethod("myAge");//第一个参数,方法名
		method.setAccessible(true);//获取访问权限
		Object object=method.invoke(s1);
		System.out.println(object);
}

(9) 获取类Student的接口

//获取类的实现接口
Class<?> [] interfaces=student.getInterfaces();
//获取类的直接继承父类
java.lang.reflect.Type type=student.getGenericSuperclass();
System.out.println(type);

反射机制的用途:动态代理、Spring等都是通过反射来实现的。功能很强大。

© 著作权归作者所有

伤了心的蜻蜓在唱歌
粉丝 0
博文 9
码字总数 9841
作品 0
开封
私信 提问
JAVA反射机制 访问对象私有变量和方法

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

梁某某
2013/10/16
3.3K
1
Java反射机制

问题: 在运行时,对一个JAVA类,能否知道属性和方法;能否调用它的任意方法? 答案是可以的,JAVA提供一种反射机制可以实现。 目录 什么是JAVA的反射机制 JDK中提供的Reflection API JAVA反...

长平狐
2012/08/29
604
0
模拟spring IOC 实现

利用java的反射和动态代理实现IOC 在Java中,其反射和动态代理机制极其强大,我们可以通过其反射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插...

candies
2014/03/02
179
0
黑马程序员--JDK1.5新特性(二)

----------------------android培训、java培训、期待与您交流!---------------------- Java反射机制定义: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性、方法...

长平狐
2013/07/01
62
0
Java核心(六)反射和动态代理(JDK Proxy和Cglib)

反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。 一、...

王磊的博客
2018/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

框架和库的区别

框架和库的区别 框架:是一套完整的解决方案;对项目的侵入性较大,项目如果需要更换框架,则需要重新架构整个项目。 node 中的 express; 库(插件):提供某一个小功能,对项目的侵入性较小...

庭前云落
9分钟前
2
1
基于 Dawn 进行多工程管理

1. 简述 当一个项目中子工程较多时,就会面临「单仓库(Monorepo)」还是「多仓库(Multirepo)」管理的问题。当然两个方式各有优缺点,而我们选择多工程单 Repo 时,能够带来一些管理上的简...

阿里云官方博客
9分钟前
1
0
Joomla 4具有可自定义的HTML电子邮件模板

Joomla 4大约每个月都会发布一个Alpha版本。上个月,我们得到了一个新的管理模板。 Joomla 4的最新版本是Alpha 12。 该版本的主要新特性是可定制的电子邮件模板。您将能够控制从您的网站发送...

六艺网络专注于Joomla
13分钟前
1
0
Idea配置

配置文件idea64.exe.vmoptions -Xms128m, 16 G 内存的机器可尝试设置为 -Xms512m (设置初始的内存数,增加该值可以提高 Java 程序的启动速度。 ) -Xmx750m, 16 G 内存的机器可尝试设置为 ...

行者终成事
15分钟前
2
0
大小仅1MB!超轻量级的人脸识别模型火爆Github

项目地址:https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB 近日,用户Linzaer在Github上开源了一款适用于边缘计算设备、移动端设备以及 PC 的超轻量级通用人脸检测...

编程资源库
16分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部