`
sinokaka
  • 浏览: 326935 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

得知引用类,很有意思sun.reflect.Reflection

阅读更多

原文地址:

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

    `sun.reflect`包是Java反射API的一部分,它包含了对Java类和接口的运行时表示以及动态访问的内部实现。反射允许程序在运行时检查和操作类、接口、字段和方法的信息。在`sun.reflect`包下,有诸如`ReflectPermission`...

    jdk sun 开头的源码

    例如,`sun.reflect.Reflection`类是反射操作的公共入口点,而`sun.reflect.generics.repository`子包则与泛型相关的反射有关。 3. **JVM相关**:`sun.jvm`包含了与Java虚拟机(JVM)密切相关的类。例如,`sun.jvm....

    scrcpy投屏 AssertionError: java.lang.reflect.InvocationTargetExcep

    标题中的问题“scrcpy投屏 AssertionError: java.lang.reflect.InvocationTargetException”是用户在尝试使用Scrcpy时遇到的一个常见错误。这个错误通常意味着在执行某个方法时,Java运行时环境遇到了未预期的情况。...

    解决axis2-CodegenWizardPluginBUG- java.lang.reflect.InvocationTargetException

    3. `一个困扰我的异常java.lang.reflect.InvocationTargetException.txt`:这是一个文本文件,很可能包含了详细的异常堆栈信息,这对于定位问题的根源至关重要。 4. `plugin.xml`:这通常是插件配置文件,用于描述...

    java.lang.reflect.Proxy 学习资料 讲解 例子 源码

    java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码

    Java.lang.reflect 包下常用的类及方法简介

    在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...

    Android代码-fest-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

    server frame base on c.rar

    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

    MyEclipse axis2 wsdl java.lang.reflect.invocationtargetexception code gen 大家要注意一定要仔细,这个问题基本上缺少包引起的,而且一定要clean 如果需要axis2插件 以及这个plugins中的包在我的其他资源里面有

    jdk1.8源码包含sun

    如`sun.reflect.Reflection`和`sun.reflect.generics.repository`等类,它们是Java动态类型和泛型的关键支持。通过这些类,开发者可以深入理解Java如何在运行时动态获取类信息,创建实例,访问和修改私有成员等。 2...

    jre 源码里面的sun. 开头源码

    5. **`sun.reflect`**: 包含了反射相关的实现,比如`ClassLoader`和`MethodAccessor`,这些帮助Java程序在运行时动态地获取类信息和调用方法。 6. **`sun.net`**: 与网络相关的实现,如TCP/IP协议栈的处理,HTTP...

    jdk源码-补充缺少sun包下的源码

    3. `sun.reflect`包:包含反射相关的类,如`sun.reflect.generics.repository`子包提供了泛型元数据的访问,有助于理解和利用反射功能。 4. `sun.security`包:涉及密码学、SSL/TLS协议、数字证书等相关实现,是Java...

    JDK源码(sun包)

    - **sun.reflect**:包含了反射相关的类,如`sun.reflect.generics.repository`子包,用于解析泛型信息。 - **sun.security**:处理与安全相关的类,如证书、密钥、加密算法等。 - **sun.awt** 和 **sun.swing**...

    JAVA8 完整源码(包含Sun包源码)

    9. **反射与注解处理**:Sun 包源码中包含了 `sun.reflect` 和 `sun.misc` 相关类,这些类对 Java 反射和注解处理提供了底层支持,虽然不推荐直接使用,但了解其工作原理有助于理解 Java 运行时机制。 10. **类加载...

    java反射(reflect)

    1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...

    Java reflect 机制详解

    免费共享,很详细的介绍了反射机制的原理,适合追根究底的java学习者

    JDK1.8完整源码,包含sun等包,以及C/C++ native层代码

    "sun"包下有很多关键的类和接口,比如反射机制的核心类`sun.reflect.*`,JVM内部类加载器`sun.misc.URLClassPath`,以及JMX(Java Management Extensions)的相关实现。由于这些类通常是私有的,不推荐在普通应用中...

    richfaces_erro

    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect....

    scala-reflect-2.12.10-API文档-中文版.zip

    赠送jar包:scala-reflect-2.12.10.jar; 赠送原API文档:scala-reflect-2.12.10-javadoc.jar; 赠送源代码:scala-reflect-2.12.10-sources.jar; 赠送Maven依赖信息文件:scala-reflect-2.12.10.pom; 包含翻译后...

Global site tag (gtag.js) - Google Analytics