Java反射详解(Spring配置)
2024-09-01 03:30:59
1. 反射原理
a).运行时通过 Class c = Class.forName("com.hua.xx.DynTest")加载类文件
b).通过 DynTest t = c.newInstance()生成实例
c).通过 class.getMethod方法获取对应的method
d).method.invoke(t, args)调用方法
public class ReflectTest {
public void sayHello( String ss ){
System.out.println(ss);
}
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//加载class
Class<?> c = Class.forName("ReflectTest");
//实例化
Object service = c.newInstance();
//获取方法, 需要执行参数,处理同方法名时的多态情况
Method method = c.getMethod("sayHello",String.class);
//调用方法
method.invoke(service,"zzzzzzz");
Method[] methods = c.getMethods();
for (Method method2 : methods) {
System.out.println(method2.getName());
System.out.println(method2.getGenericReturnType());
Type[] types = method2.getGenericParameterTypes();
for (Type type : types) {
//获取参数类型
System.out.println(type.getTypeName());
}
System.out.println("\n");
}
}
}
2. getMethod--获取方法列表
//方法, 几乎可以还原一个class的原貌,除了class引用的其它classes(需要记录下所有入参和返回值的类型,加以剔除)
Method[] methods = c1.getMethods();
System.out.println(method.getName());
System.out.println(method.getGenericParameterTypes().length);
System.out.println(method.getGenericReturnType());
3. newInstance -- 构造函数
a). 无入参的构造函数
Class c = Class.forName("DynTest");
obj = c.newInstance();
b). 带入参的构造函数 (先获得指定的constructor)
Class c = Class.forName("DynTest");
Class[] pTypes = new Class[] { double.class, int.class };
Constructor ctor = c.getConstructor(pTypes); //指定的构造函数
Object[] arg = new Object[] {3.14159, 125}; //自变量
Object obj = ctor.newInstance(arg);
c). 多参数的方法
Class ptypes[] = new Class[2];
ptypes[0] = Class.forName("java.lang.String");
ptypes[1] = Class.forName("java.util.Hashtable");
Method m = c.getMethod("func",ptypes);
4. invoke -- 调用方法
//先获取方法,组装入参,再实例,调用
Test obj = new Test();
Object args[] = new Object[2];
arg[0] = new String("Hello,world");
arg[1] = null;
Object r = m.invoke(obj, arg);
Object r = m.invoke(null, arg); //如果被调用方法是static,则第一个参数null
5. 运行时变更fields内容
//先获取field,再示例,再修改
public class Test {
public double d;
public static void main(String args[])
{
Class c = Class.forName("Test");
Field f = c.getField("d"); //指定field 名称
Test obj = new Test();
System.out.println("d= " + (Double)f.get(obj));
f.set(obj, 12.34);
System.out.println("d= " + obj.d);
}
}
最新文章
- ABP框架 - 集成OWIN
- cookie自动登录的实现
- Android-Activity-Dialog theme touch outsize
- Java虚拟机内存管理原理基础入门
- 常用数据库高可用和分区解决方案(1) — MySQL篇
- [原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
- 不同浏览器对document.documentElement和document.body的scrollheight ,scrollTop,clientHeight以及判断滚动条是否滚动到页面最底部 【转载】
- 破解 CrackMe#1 [UBC] by bRaINbuSY
- JS的基础语法
- 10 ways to be a faster code reviewer--reference
- centos6.5安装python3
- Ceph BlueStore 解析:Object IO到磁盘的映射
- 使用boost/property_tree进行XML操作
- 【转】使用nvm快速搭建 Node.js 开发环境
- rsync命令详解、rsync用ssh隧道方式同步
- Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)
- asp.net 获取网站根目录总结
- 原生JavaScript写select下拉选择后跳转页面
- MapReduce 踩坑 :Aggregation is not enabled. Try the nodemanager at IP:HOST
- extJs常用的四种Ajax异步提交