Java反射(Reflection)就是在运行 Java 程序时,可以加载、探知、使用编译期间完全未知的类。也就是说,Java 程序可以加载一个运行时才得知类名的类,获得类的完整构造方法,并实例化出对象,给对象属性设定值或者调用对象的方法。本文我们就来通过Java反射实例来理解Java中的反射机制。
一、利用反射获取类信息的方式、获取当前类的所有方法和获取当前类及其父类的所有方法
实体类
package org.dennisit.reflect.entity;
import java.io.Serializable;
public class User implements Serializable{
private String test;
public void execute(String name,int age){
System.out.println("name=" + name + ",age=" + age);
}
}
反射测试类
package org.dennisit.reflect.main;
import java.lang.reflect.Field;
public class ReflectEx {
public static void main(String[] args)throws Exception {
Class cls = Class.forName("org.dennisit.reflect.entity.User");
Object obj = cls.newInstance(); //创建User的对象
Field f = cls.getDeclaredField("test"); //获取test属性
f.setAccessible(true); //打开私有属性test的访问权限
f.set(obj, "zhangsan"); //为test重新复制
System.out.println(f.get(obj)); //获取obj的test属性值
//根据方法名execute获取方法
java.lang.reflect.Method m = cls.getMethod("execute", String.class, int.class);
m.invoke(obj, "dennisit",23); //调用execute方法
}
}
运行效果
zhangsan
name=dennisit,age=23
二、编写一个反射动态实例化类的例子
package org.dennisit.reflect.main;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;
public class DynamicReflect {
public static Object getInstance(String className,Map<String,Object> map)throws Exception{
Class c = Class.forName(className);
Object obj = c.newInstance(); //对象对象
Set<String> keys = map.keySet(); //获取对应的所有属性
Field[] fAll = c.getDeclaredFields(); //获取类中所有属性
for(int i=0;i<fAll.length;i++){
for(String key:keys){ //循环匹配
if(fAll[i].getName().equals(key)){ //如果用户传入的属性跟获取到的类中的属性名匹配
Field f = c.getDeclaredField(key);//获取该属性
//构建setXxx()方法名
String methodName = "set" + key.substring(0,1).toUpperCase()+key.substring(1);
Method method = c.getMethod(methodName, f.getType());//根据构建的用户名获取对应的方法
method.invoke(obj, map.get(key));//方法调用
}else{
continue;
}
}
}
return obj;
}
}
三、接下来我们测试我们编写的动态反射实例化例子
实体类
package org.dennisit.reflect.entity;
import java.io.Serializable;
public class User implements Serializable{
private String name;
private int age;
private String email;
public User() { //必须有无参构造
}
//getter() and setter()
}
主测试类
package org.dennisit.reflect.main;
import java.util.HashMap;
import java.util.Map;
import org.dennisit.reflect.entity.User;
public class ReflectEx {
public static void main(String[] args)throws Exception {
Class cls = Class.forName("org.dennisit.reflect.entity.User");
String className = "org.dennisit.reflect.entity.User";
Map<String,Object> map = new HashMap<String, Object>();
map.put("name", "dennisit");
map.put("age", 22);
map.put("email", "dennisit@163.com");
User user = (User)DynamicReflect.getInstance(className, map);
System.out.println(user.getName() + "," + user.getAge() + "," + user.getEmail());
}
}
程序运行结果
dennisit,22,dennisit@163.com
以上就是Java反射实例,借助这些Java反射实例,能够帮助我们刚好的理解Java反射机制。实际上,反射的工作原理就是借助Class.java、Constructor.java、Method.java、Field.java这四个类在程序运行时动态访问和修改任何类的行为和状态。想要了解更深层次的反射机制,快来观看本站的Java基础教程吧!
在实际项目的开发中,框架和类都是不可缺少的,反射是将框架和类结合在一起的粘合剂,所以想学好编程,学好反射机制是十分重要的。这篇文章来介绍java反射机制的相关基础知识,java零基础的新手朋友们可以来来学习下面的内容。
在java中使用反射机制,会提高程序的灵活性和扩展性,还能节省资源,因此在java编程中使用好反射是重要的。今天来学习java反射field用法的内容。
与传统的通过new 来获取对象的方式不同,利用Java反射获取对象会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”再通过构造器对象创建一个对象。
jQuery是一个快速、简洁的JavaScript框架
Java SE(Java Platform, Standard Edition,Java标准版),基础进阶
Java SE(Java Platform, Standard Edition,Java标准版),零基础入门
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目
Docker 是一个基于 Go 语言 并遵从 Apache2.0 协议开源的应用容器引擎,让开发者可以打包应用到一个可移植的镜像中
IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境,它所提倡的是智能编码,是减少程序员的工作
动力节点在线报名表(此信息已加密,请放心填写)