我是靠谱客的博主 炙热宝马,最近开发中收集的这篇文章主要介绍sun.reflect.Reflection(转),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

几个礼拜前,我和我一位叫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]}

getCallerClass的试用:

GetCallerClass是Sun.Reflector包下Reflection类的方法

定义为GetCallerClass(int level)

0  -   返回 Reflection类

1  -   返回调用GetCallerClass的类,比如  Class Test{void test(){Class cs = Reflection.GetCallerClass(1)}}, 返回Test.

2  -    返回再上层的类, 如Class Main{new Test().test()}, GetCallerClass(2) 则返回Main.

3. 4. ....层层上传。

转载于:https://my.oschina.net/hly3825/blog/33737

最后

以上就是炙热宝马为你收集整理的sun.reflect.Reflection(转)的全部内容,希望文章能够帮你解决sun.reflect.Reflection(转)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部