原文地址:
http://www.javaspecialists.co.za/archive/newsletter.do?issue=087&locale=zh_CN
sun.reflect.Reflection
几个礼拜前,我和我一位叫Niko Brummer的朋友聊天。他是一位音响检验方面的专家,热爱水上运动,并且喜欢把他的理论知识应用到运动中。Niko十分愿意随时与你谈论他在Java(和海洋)方面的最新发现。
我们聊天的时候,Niko提到了一个我未曾听闻的、叫作“Reflection”的类。这个类是Sun JVM一起附带的,可以在sun.reflect.*包里找到它。其中最有用的方法是: Class getCallerClass(int i)
. 这个类能告诉你在我们当前的调用堆栈中有哪些类。
让我们来看一个例子,是做汤时需要用到的一些类。(假设你想为几百人做一道美味的蔬菜汤,请看一下 我们网站上的这个菜谱 ;-) 我们希望土豆(Potato)有一个指向它所在汤(Soup)的一个引用,并且我们希望汤(Soup)明白它自己包含哪些土豆(Potato)。请记住,这个解决方法只是众多可能的一种,并且只是作为一个演示如何使用这个Reflection类的例子。
import java.util.*;
public class Soup {
private final List potatos = new ArrayList();
public void add(Potato p) {
potatos.add(p); p.setSoup(this);
}
public String toString() {
return "Soup {potatos=" + potatos + "}";
}
}
import sun.reflect.Reflection;
public class Potato {
private final int id;
private Soup soup;
public Potato(int id) {
this.id = id; }
public void setSoup(Soup soup) {
this.soup = soup;
if (Reflection.getCallerClass(2) !=
Soup.class) {
soup.add(this); }
}
public Soup getSoup() {
return soup; }
public String toString() {
return "Potato " + id; }
}
Potato.setSoup是个有趣的方法,它检查调用它的类是否是Soup。getCallerClass采用堆栈层次作为参数,这个例子中是2。
我们可以试着做一道汤(Soap),加入一些土豆(Potato),然后把汤和一个无关联的 Potato建立关系(Association)。
public class SoupTest {
public static void main(String[] args) {
Soup soup = new Soup(); soup.add(new
Potato(1)); soup.add(new Potato(2));
soup.add(new Potato(3)); Potato p4 = new
Potato(4); soup.add(p4); p4.setSoup(soup); // redundant code
Potato p5 = new Potato(5); p5.setSoup(soup);
System.out.println("soup = " + soup);
}
}
用java -showversion SoupTest
执行这段代码的结果:
java version "1.4.2_04" Java(TM) 2 Runtime Environment, Standard Edition
(build 1.4.2_04-b05) Java HotSpot(TM) Client VM (build 1.4.2_04-b05, mixed
mode)
soup = Soup {potatos=[Potato 1, Potato 2, Potato 3, Potato 4, Potato 4, Potato
5]}
分享到:
相关推荐
jdk1.8的src,扩展了sun.reflect,unsafe。
scrcpy投屏 AssertionError: java.lang.reflect.InvocationTargetException 安装这个版本的scrcpy即可。
解决axis2-CodegenWizardPlugin的BUG,java.lang.reflect.InvocationTargetException 带有相关jar 包及相关文件
java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke...
MyEclipse axis2 wsdl java.lang.reflect.invocationtargetexception code gen 大家要注意一定要仔细,这个问题基本上缺少包引起的,而且一定要clean 如果需要axis2插件 以及这个plugins中的包在我的其他资源里面有
MyEclipse6.0下axis2插件的安装! 解决java.lang.reflect.InvocationTargetException本人亲自测试,完美使用!
NULL 博文链接:https://inter12.iteye.com/blog/1288117
免费共享,很详细的介绍了反射机制的原理,适合追根究底的java学习者
// import static org.fest.reflect.core.Reflection.*; // Loads the class 'org.republic.Jedi' Class jediType = type("org.republic.Jedi").load(); // Loads the class 'org.republic.Jedi' as 'org.repu
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect....
java 反射实战demo,Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。...
reflection.js v1.5 给图片加倒影效果,使用非常简单给 img标签加上class="reflect" 即可.
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at ...
NULL 博文链接:https://kdisk-sina-com.iteye.com/blog/258942
java反射(reflect)
这意味着像sun.misc和sun.reflect这样的非标准包对你的包不可用,即使它们是常用的。 解决此问题的最简单方法是使用扩展包。 这是一个片段包,除了如下所示的清单外,不包含任何内容: Export-Package: sun.misc...
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap...
Boost Reflect是一款基于C++实现的开源反射库,类似java反射。 不过年代稍远,最近的更新也是8年前了。 git地址:https://github.com/bytemaster/boost_reflect
java.lang.reflect.invocationtargetexception问题的解决方法之一