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);
}
}

最新文章

  1. ABP框架 - 集成OWIN
  2. cookie自动登录的实现
  3. Android-Activity-Dialog theme touch outsize
  4. Java虚拟机内存管理原理基础入门
  5. 常用数据库高可用和分区解决方案(1) — MySQL篇
  6. [原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
  7. 不同浏览器对document.documentElement和document.body的scrollheight ,scrollTop,clientHeight以及判断滚动条是否滚动到页面最底部 【转载】
  8. 破解 CrackMe#1 [UBC] by bRaINbuSY
  9. JS的基础语法
  10. 10 ways to be a faster code reviewer--reference
  11. centos6.5安装python3
  12. Ceph BlueStore 解析:Object IO到磁盘的映射
  13. 使用boost/property_tree进行XML操作
  14. 【转】使用nvm快速搭建 Node.js 开发环境
  15. rsync命令详解、rsync用ssh隧道方式同步
  16. Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)
  17. asp.net 获取网站根目录总结
  18. 原生JavaScript写select下拉选择后跳转页面
  19. MapReduce 踩坑 :Aggregation is not enabled. Try the nodemanager at IP:HOST
  20. extJs常用的四种Ajax异步提交

热门文章

  1. Python知识点: __import__
  2. Ruby中的include
  3. CSS是什么?W3C是什么?W3C盒子与IE盒子的区别?
  4. URL网址规范化
  5. JAVA基础知识总结4(面向对象特征之一:封装)
  6. #410(div2)B. Mike and strings
  7. Angular12 学习angular2前的热身准备
  8. 【机器学习】推荐系统、SVD分解降维
  9. 20169219linux 内核原理与分析第五周作业
  10. 【mysql-索引+存储过程+函数+触发器-更新。。。】