Java 反射类--Class

我们先来看反射提供的功能:

反射机制提供功能:加载运行时确定数据类型,解析类结构,获取内部信息

操作该类型或实例,访问属性,调用方法,创建新对象


java反射是谁来提供呢?

Class对象提供,但是首先需要通过JVM获取对象,创建Class对象


创建Class对象有三种方式:

使用Class类的forName()静态方法如:Class.forName(java.lang.reflect.Field)

调用类的class书香获取对应的Class对象,

调用某个对象的getClass()方法

获取Class对象,就可以得到对象的真实信息

如:对象的构造函数,属性,方法,注解,接口,父类,注解(必须是具有源码,否则注解不能查询到)等

如:

Constructor<?>getconstructors()返回class对象标识的所有public 构造器
Method[] getMethods()
FieldgetField(String name)
Annotation[]getAnnotations()

以上方法是有多重载的,可根据参数类型获取不同如 class.getMethod("info",String.class) 


反射能做什么?

以上是通过反射获取对象,取得对象的属性方法

同时反射还可以生成对象以及操作对象的方法,形成动态代理的基础,ORM的基础

创建对象方式

使用Class对象newIntance()创建class对象实例,但必须有默认构造器

或使用class对象指定的构造器,再调newInstance方法,可以创建指定实例


 事例

获取某个对象,并创建该对象调用该对象方法

1 POJO类

public class User {

	
	private String userName;
	private String password;

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	public User(){
		
	}
	
	public User(String username){
		this.userName=username;
	}

2 调用类与实例

public static void main(String[] args) throws SecurityException,
			NoSuchFieldException, InstantiationException, IllegalAccessException,
			NoSuchMethodException, ClassNotFoundException {

		getProperty(User.class);//调用
	}

	public static void getProperty(Class<?> entityClass) throws SecurityException,
			NoSuchFieldException, InstantiationException, IllegalAccessException,
			NoSuchMethodException, ClassNotFoundException {

		//-----start----反射获取对象---------
		String cName = entityClass.getName();
		// 从类的名字中解析出类名
		String userName = cName.substring(cName.lastIndexOf(".") + 1, cName.length());
		System.out.println("实体名称为:"+ userName);
		// 获取对象的所有属性
		Field[] fields = entityClass.getDeclaredFields();

		// 获取对象的所有方法
		Method[] methods = entityClass.getDeclaredMethods();
		List<String> listfeld = new ArrayList<>();
		for (Field field : fields) {
			System.out.println("属性名称有:" + field.getName());

		}
		for (Method method : methods) {
			System.out.println("方法名称有:" + method.getName());
		}
		
		//-------反射获取对象-end--------+
		
		//反射创建对象,调用对象方法-------start--------
		User userfroname = (User)	Class.forName(cName).newInstance();        //获取Class对象方式1 :通过字符串
		User userClass = (User) entityClass.newInstance();                      //获取Class对象方式2: 通过Class类型
		userClass.setUserName("我的大名是:任秋明---通过class名称创建对象");
		userfroname.setUserName("我的大名是:任秋明--Class类型创建对象");
		System.out.println(userClass.getUserName());
		System.out.println(userfroname.getUserName());
		//反射创建对象,调用对象方法-------end--------
	}

3 测试结果


实体名称为:User
属性名称有:userName
属性名称有:password
方法名称有:getUserName
方法名称有:setUserName
方法名称有:setPassword
方法名称有:getPassword
我的大名是:任秋明---通过class名称创建对象
我的大名是:任秋明--Class类型创建对象


小结:

 总的来说,java反射机制可以解决一些不灵活的程序,IOC的依赖注入,动态代理,动过名称反射调用类的方法。但与此同时反射同时也带来的效率上的问题,凡事都有两面性,要灵活难免牺牲效率。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。