java反射示例代码 java反射总结( 二 )


上面加载、链接、初始化的各个阶段并不是彼此独立,而是交叉进行,这点很重要。
***class.forName和 classloader的区别
Class.forName 和 ClassLoader 都是用来装载类的,对于类的装载一般为分三个阶段加载、链接、编译,它们装载类的方式是有区别 。
首先看一下 Class.forName(..),forName(..)方法有一个重载方法 forName(className,boolean,ClassLoader),它有三个参数,第一个参数是类的包路径 , 第二个参数是boolean
类型,为 true 地表示 Loading 时会进行初始化,第三个就是指定一个加载器;当你调用class.forName(..)时,默认调用的是有三个参数的重载方法,第二个参数默认传入true,第三个参数默认使用的是当前类加载时用的加载器 。
ClassLoader.loadClass()也有一个重载方法,从源码中可以看出它默认调的是它的重载方法 loadClass(name, false) , 当第二参数为 false 时,说明类加载时不会被链接 。这也是两者之间最大区别,前者在加载的时候已经初始化 , 后者在加载的时候还没有链接 。如果你需要在加载时初始化一些东西,就要用 Class.forName 了,比如我们常用的驱动加载 ,  实际上它的注册动作就是在加载时的一个静态块中完成的 。所以它不能被 ClassLoader 加载代替 。
JAVA反射机制代码1.就是说根据你传进去的对象类型返回相应的代理 。这个不是在静态编译时决定的, 而是运行时决定的,所以叫做动态 。this指的是当前InvocationHandler对象,也就是new MyInvocationHandler()出来的 。
2.执行RealSubject中的say方法 , 因为这个时候实际的对象是bind(new RealSubject()) 。
3.没有调用自己啊 。
java中反射的三种方法是?第一种:通过forName()方法;
第二种:类.class;
第三种:对象.getClass() 。
举例如下:
package
test;
public class Demo{
public static void
main(){
Class? c1 = null;
Class? c2 =
null;
Class? c3 =
null;
//三种反射用实例化方式
try{
//最常用的一种形式
c1 =
Class.forName("test.X");
}catch(ClassNotFoundException
e){
e.printStackTrace();
}
//通过Object类中的方法实例化
c2
= new X().getClass();
//通过类.class实例化
c3 =
X.class;
System.out.println("类名:" + c1.getName());
//得到类名
System.out.println("类名:" + c2.getName());
//得到类名
System.out.println("类名:" + c3.getName());
//得到类名
}
}
关于java反射示例代码和java反射总结的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

推荐阅读