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

Java反射详解(Spring配置)的更多相关文章

  1. java 反射详解

    反射的概念和原理 类字节码文件是在硬盘上存储的,是一个个的.class文件.我们在new一个对象时,JVM会先把字节码文件的信息读出来放到内存中,第二次用时,就不用在加载了,而是直接使用之前缓存的这个 ...

  2. Java 反射详解 转载

    java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ...

  3. java反射 详解!!!!

    java反射(特别通俗易懂) 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态 ...

  4. 【转载】Java 反射详解

    目录 1.什么是反射? 2.反射能做什么? 3.反射的具体实现 4.根据反射获取父类属性 4.反射总结 反射反射,程序员的快乐! 1.什么是反射? Java反射就是在运行状态中,对于任意一个类,都能够 ...

  5. java反射详解及说明

    首先写一个Person类: package lltse.base.reflectdemo; public class Person { private String name ="张三&qu ...

  6. 《Java基础知识》Java 反射详解

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

  7. Java反射详解(转)

    原文地址:http://www.importnew.com/17616.html 动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所 ...

  8. Java反射详解:入门+使用+原理+应用场景

    反射非常强大和有用,现在市面上绝大部分框架(spring.mybatis.rocketmq等等)中都有反射的影子,反射机制在框架设计中占有举足轻重的作用. 所以,在你Java进阶的道路上,你需要掌握好 ...

  9. java反射详解

    本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象 ...

随机推荐

  1. Python:内置函数zip()

    zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象. 这个可迭代对象可以使用循环的方式列出其元素 若多个可迭代对象的长度不一致,则所返回的 ...

  2. ASP.NET MVC 3:缓存功能的设计问题

    今天这一篇文章我来谈一谈在MVC 3项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考. 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例 ...

  3. Python-IO模式介绍

    事件驱动模型:有个事件队列,把事件放到队列里,然后循环这个队列,取出事件执行 5种IO模式: 阻塞 I/O(blocking IO) 非阻塞 I/O(nonblocking IO) I/O 多路复用( ...

  4. paramiko使用1

  5. Delegate Action<T in> Func<T in,out Tresult> Predicate<T>

    action<T> 和  func<T> 都是delegate的简写形式,其中T为可以接受的参数类型 action<T> 指那些只有输入参数,没有返回值 Deleg ...

  6. ssh的两种连接方法(包括无密码访问)

    一.正常连接方法:ssh root@10.0.0.20 二.无密码连接方法(有两台机器:此处我把被连接的称为服务器,另一台则称为客户端): 1.先在服务器添加目录 .ssh: mkdir  .ssh ...

  7. [hdu4372]counting buildings

    解题关键: n的环排列的个数与n-1个元素的排列的个数相等. 首先可以肯定,无论从最左边还是从最右边看,最高的那个楼一定是可以看到的,从这里入手. 假设最高的楼的位置固定,最高楼的编号为n,那么我们为 ...

  8. linux命令-stty

    一.用途: stty——改变和打印终端行设置 二.参数: 1.打印终端行设置 -a,--all   以人可读的方式打印所有当前设置:-a参数比单独的stty命令输出的终端信息更详细 -g,--save ...

  9. jquery 操作表格实例

    案例1:隔行变色,滑动,点击变色以(选中取消效果)(addClass(),removeClass(),toggleClass()) Html: <h4>1.隔行变行</h4> ...

  10. ProtoBuf练习

    环境设置 项目地址 https://github.com/silvermagic/ProtoBufDev.git 操作系统 64位 Fedora 24 安装protobuf $ git clone h ...