原文地址:
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]}
分享到:
相关推荐
`sun.reflect`包是Java反射API的一部分,它包含了对Java类和接口的运行时表示以及动态访问的内部实现。反射允许程序在运行时检查和操作类、接口、字段和方法的信息。在`sun.reflect`包下,有诸如`ReflectPermission`...
例如,`sun.reflect.Reflection`类是反射操作的公共入口点,而`sun.reflect.generics.repository`子包则与泛型相关的反射有关。 3. **JVM相关**:`sun.jvm`包含了与Java虚拟机(JVM)密切相关的类。例如,`sun.jvm....
3. `一个困扰我的异常java.lang.reflect.InvocationTargetException.txt`:这是一个文本文件,很可能包含了详细的异常堆栈信息,这对于定位问题的根源至关重要。 4. `plugin.xml`:这通常是插件配置文件,用于描述...
java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码
在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...
// 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.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中的包在我的其他资源里面有
如`sun.reflect.Reflection`和`sun.reflect.generics.repository`等类,它们是Java动态类型和泛型的关键支持。通过这些类,开发者可以深入理解Java如何在运行时动态获取类信息,创建实例,访问和修改私有成员等。 2...
5. **`sun.reflect`**: 包含了反射相关的实现,比如`ClassLoader`和`MethodAccessor`,这些帮助Java程序在运行时动态地获取类信息和调用方法。 6. **`sun.net`**: 与网络相关的实现,如TCP/IP协议栈的处理,HTTP...
3. `sun.reflect`包:包含反射相关的类,如`sun.reflect.generics.repository`子包提供了泛型元数据的访问,有助于理解和利用反射功能。 4. `sun.security`包:涉及密码学、SSL/TLS协议、数字证书等相关实现,是Java...
- **sun.reflect**:包含了反射相关的类,如`sun.reflect.generics.repository`子包,用于解析泛型信息。 - **sun.security**:处理与安全相关的类,如证书、密钥、加密算法等。 - **sun.awt** 和 **sun.swing**...
9. **反射与注解处理**:Sun 包源码中包含了 `sun.reflect` 和 `sun.misc` 相关类,这些类对 Java 反射和注解处理提供了底层支持,虽然不推荐直接使用,但了解其工作原理有助于理解 Java 运行时机制。 10. **类加载...
1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...
免费共享,很详细的介绍了反射机制的原理,适合追根究底的java学习者
"sun"包下有很多关键的类和接口,比如反射机制的核心类`sun.reflect.*`,JVM内部类加载器`sun.misc.URLClassPath`,以及JMX(Java Management Extensions)的相关实现。由于这些类通常是私有的,不推荐在普通应用中...
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect....
reflection.js v1.5 给图片加倒影效果,使用非常简单给 img标签加上class="reflect" 即可.