您的位置:首页 > 编程语言 > Java开发

java基础之类型信息

2014-08-21 11:31 204 查看


java基础之类型信息

博客分类:

java学习笔记

类型信息动态代理



这次主要学习java是如何在运行时识别对象和类的信息的。主要包括了两种方式:①RTTI(Run-Time Type Information)②反射。它们都可以使我们在运行时能够识别对象的类型信息。

首先我们应当知道类型信息在java中是如何表示的。我们可以看到一个java类进行编译时会产生一个同名的class文件,这里就保存着该java类对应的Class对象,Class对象可以用来创建其他的对象以及类的RTTI。所有的类在第一次被使用时都会被加载到JVM中,但我们需要注意的是Java程序在开始运行之前并不是被完全加载的而是动态加载的。获取Class对象有一下三种方法:

①Class.forName()

②类名.class

③对象.getClass()

其中③是在已经拥有到实际的对象,然后通过getClass()获取该类的Class对象的引用。

①和②都可以获取到Class对象但是又存在些许的区别,使用.class语法来获得对类的引用不会触发对类的初始化,而使用①就会立即触发对类的初始化。

可以通过下面的代码看出来:

Java代码


class Initable {

static final int staticFinal = 47;

static final int staticFinal2 =

ClassInitialization.rand.nextInt(1000);

static {

System.out.println("Initializing Initable");

}

}

class Initable2 {

static int staticNonFinal = 147;

static {

System.out.println("Initializing Initable2");

}

}

class Initable3 {

static int staticNonFinal = 74;

static {

System.out.println("Initializing Initable3");

}

}

public class ClassInitialization {

public static Random rand = new Random(47);

@SuppressWarnings({ "unused", "rawtypes" })

public static void main(String[] args) throws Exception {

Class initable = Initable.class;

System.out.println("After creating Initable ref");

System.out.println(Initable.staticFinal);

System.out.println(Initable.staticFinal2);

System.out.println(Initable2.staticNonFinal);

Class initable3 = Class.forName("Initable3");

System.out.println("After creating Initable3 ref");

System.out.println(Initable3.staticNonFinal);

}

}

输出结果为:

After creating Initable ref

47

Initializing Initable

258

Initializing Initable2

147

Initializing Initable3

After creating Initable3 ref

74

在获取到Class对象以后我们就是通过Class对象的一些方法获取到更多的信息,例如getMehthod(),getConstructor()等。

②如果我们在编译时不知道获取对象的确切类型,此时我们可以使用反射。下面是一个动态代理的例子。

Java代码


class MethodSelector implements InvocationHandler {

private Object proxied;

public MethodSelector(Object proxied) {

this.proxied = proxied;

}

public Object

invoke(Object proxy, Method method, Object[] args)

throws Throwable {

if(method.getName().equals("interesting"))

System.out.println("Proxy detected the interesting method");

return method.invoke(proxied, args);

}

}

interface SomeMethods {

void boring1();

void boring2();

void interesting(String arg);

void boring3();

}

class Implementation implements SomeMethods {

public void boring1() { System.out.println("boring1"); }

public void boring2() { System.out.println("boring2"); }

public void interesting(String arg) {

System.out.println("interesting " + arg);

}

public void boring3() { System.out.println("boring3"); }

}

class SelectingMethods {

public static void main(String[] args) {

SomeMethods proxy= (SomeMethods)Proxy.newProxyInstance(

SomeMethods.class.getClassLoader(),

new Class[]{ SomeMethods.class },

new MethodSelector(new Implementation()));

proxy.boring1();

proxy.boring2();

proxy.interesting("bonobo");

proxy.boring3();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: