用反射机制调用对象的方法
Class<?> classType = A.class;
try {
// Object aa = classType.newInstance();
Object a = classType.getConstructor(new
Class[]{}).newInstance(new Object[]{});
//获取InvokeTester类的add()方法
Method addMethod = classType.getMethod("add", new Class[]{int.class});
//调用invokeTester对象上的add()方法
Object result;
result = addMethod.invoke(a, new Object[]{new Integer(100)});
System.out.println((Integer) result);
//获取InvokeTester类的echo()方法
Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
//调用invokeTester对象的echo()方法
result = echoMethod.invoke(a, new Object[]{"Hello"});
System.out.println((String) result);
动态创建和访问数组
Class<?> classType = Class.forName("java.lang.String");
// 创建一个长度为10的字符串数组
Object array = Array.newInstance(classType, 10);
// 把索引位置为5的元素设为"hello"
Array.set(array, 5, "hello");
Array.set(array, 6, "world");
// 获得索引位置为5的元素的值
String s = (String) Array.get(array, 5);
System.out.println(s);
int[] dims = new int[]{5, 10, 15};
//创建一个具有指定的组件类型和维度的新数组。
Object array = Array.newInstance(Integer.TYPE, dims);
Object arrayObj = Array.get(array, 3);
Class<?> cls = arrayObj.getClass().getComponentType();
System.out.println(cls);
arrayObj = Array.get(arrayObj, 5);
Array.setInt(arrayObj, 10, 37);
int arrayCast[][][] = (int[][][]) array;
System.out.println(arrayCast[3][5][10]);
自动去代理执行被代理对象
class B implements InvocationHandler {
/**
*
* 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)
*/
private Object delegate;
/** */
/**
* 动态生成方法被处理过后的对象 (写法固定)
*
* @param delegate
* @param proxy
* @return
*/
public Object bind(Object delegate) {
this.delegate = delegate;
return Proxy.newProxyInstance(
this.delegate.getClass().getClassLoader(), this.delegate
.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
try {
// 执行原来的方法之前记录日志
logging(method.getName() + " Method end .");
// JVM通过这条语句执行原来的方法(反射机制)
result = method.invoke(this.delegate, args);
// 执行原来的方法之后记录日志
logging( method.getName() + " Method Start!");
} catch (Exception e) {
e.printStackTrace();
}
// 返回方法返回值给调用者
return result;
}
public void logging(String msg){
System.out.println(msg);
}
}
代理调用代码
A a = new A();
B b =new B();
b.bind(a);
try {
Method addMethod = A.class.getMethod("add", new Class[]{int.class});
b.invoke(null, addMethod, new Object[]{new Integer(10)});
} catch (Throwable e) {
e.printStackTrace();
}
Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。
反射有两个缺点。第一个是性能问题。当用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。
许多应用更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射-- 仅在它可以真正增加灵活性的地方。
分享到:
相关推荐
Java——枚举: enum关键字、Enum类 类集对枚举的支持——EnumMap类与EnumSet类 枚举类实现接口、在枚举类中定义抽象方法 Java反射机制: Class类、Class类的使用 反射的应用:取得类的结构
JAVA反射机制自定义框架测试代码,留着以后复习用!
数据结构,面向对象,反射,IO流,NIO,IO多路复用,JVM,并发.....
reflection是一系列的API,用于表示或者处理当前JVM中的类,接口和对象. java.lang.reflect/java.lang.Class 在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
【Java工程师面试复习指南】本仓库架构大部分Java工程师所需要掌握的核心知识,整合了互联网上的很多优质Java技术文章,力求打造为最完整最实用的Java开发者学习指南,如果对你有帮助,给个star告诉我吧,谢谢!...
Java基础知识复习02:从修饰符到反射注解(续01)
java基础复习 反射、io流
介绍了反射的作用、如何进行反射,Class对象反射构造器、反射方法、反射属性以及实例应用。浓缩精简版、适合初学反射或者复习相关知识。
北大青鸟ACCP6.0 第三学期 Y2 JAVA方向 reflection 反射 基础复习 上课示例
635.633.JAVA基础教程_反射-复习:TCP、UDP、URL网络编程(635).rar
突然发现自己Java基础的底子不到位,复习! 所记知识会发布在CSDN与博客网站jirath.cn 《Java基础复习》—常识与入门 一、Java语言的知识体系图 分为三部分 编程语言核心结构:变量、基本语法、分支、循环、数组 ...
包括java基本语法到xml和json+正则+反射
多线程 类型参数 泛型通配符 反射 JavaBean
内容概要:以上列出的Java面试题涵盖了Java语言的基础知识、面向对象编程、集合、IO流、多线程、反射、类加载器、JVM、序列化、泛型、异常处理、注解等多个方面。 适用人群:以上Java面试题适用于准备Java开发...
Java 基础核心总结 包括java概述、开发环境配置、基本语法、执行控制流程、面向对象、 访问控制权限、接口和抽象类、异常、内部类、集合、泛型、反射、枚举 I/O等。
JavaSe的例题训练,学习和复习Java都可以用的到,包含各个章节的题,Java经典例题,从最基础的例题一直到反射注解
动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...
该资源是书本后面的模拟试题的答案,本书的课后习题答案可以参考我上传的另外一个资源
《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...
内容概要:最新2023年Java后端面试题整理, 包含多线程,集合,框架,反射,泛型等等问题, 用简洁明了的语言,通俗易懂地阐述了Java相关的知识点。 适用人群:适合想了解或学习Java的 IT 学生、开发人员、研究人员...