沙漠中的鱼

欲上天堂,先下地狱
posts - 0, comments - 56, trackbacks - 0, articles - 119
  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理

Class.forName("Gum");

forName是取得Class引用的一种方法,返回一个Class对象的引用。

如果Gum类还没有被加载就加载它,在加载过程中,Gum的静态子句被执行。

可能产生的异常:ClassNotFoundException

Class.getInterfaces("Gum")

返回对象是Class类型,表示类Gum包含的接口

如类Gum implements interface1,

则会获取到interface1的类对象

Class.newInstance()

实现“虚拟构造器”的一种途径

 

类字面常量

obj.Class生成对Class对象的引用,它比forName更加安全,因为它在编译时就接受检查。

注意:当使用.Class来创建Class对象的引用时,不会自动初始化Class对象。

class Initable{
    
static final int staticFinal=47;
    
static final int staticFinal2=ClassInitialization.rand.nextInt(1000);
    
static{
        System.out.println(
"Initialzing Initable");
    }

}

class Initable2{
    
static int staticNonFinal=147;
    
static{
        System.out.println(
"Initialzing Initable2");
    }

}

class Initable3{
    
static int staticNonFinal=74;
    
static{
        System.out.println(
"Initialzing Initable3");
    }

}

public class ClassInitialization {
    
public static Random rand=new Random(47);
    
public static void main(String[] args){
        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);
    }

}

 

输出结果为:

Initialzing Initable
After creating Initable ref
47
258
Initialzing Initable2
147
Initialzing Initable3
After creating Initable3 ref
74

结论:如果一个static final值是"编译期常量",就象Initable.staticFinal那样,那么这个值不需要对Initable类初使化就可以读取,但是如果只是将一个域设置为static和final的,如对Initable.staticFinal2的访问将进行强制的初使化,因为它不是一个编译型常量。

如果一个static而不是final的,那么在它访问时,总是要求进行链接(为这个域分配存储空间)和初始化(初始化该存储空间),就像对Initable2.staticNonFinal那样。

泛化的Class引用

Class<Integer> iniClass=int.class

新的转型语法

case()

InstanceOf

反射

getMethods()返回Method对象的数组

getConstructors()返回Contructor对象的数组

动态代理

实现InvocationHandler接口

public Object invoke(Objct proxy,Method method,Object[] args)throws Throwable{}方法

通过Proxy.newProxyInstance(ClassLoader,Class[],InvocationHandler)创建动态代理

具体示例参见:

http://www.blogjava.net/aoneany/articles/271019.html


只有注册用户登录后才能发表评论。


网站导航: