Java Class.forname
2016-03-22 11:08
417 查看
Class.forName(xxx.xx.xx) 返回的是一个类,作用是要求JVM查找并加载指定的类。由于类与静态代码是绑定的,因此也会执行静态代码段。但是没有实例化。例如
输入java DynamicLoader A a1 a2 a3
输出A static
如果把toRun.newInstance();这句话的注释去掉,输出
A static
init A
Class.forName与newInstance() 相当于把Class A=new A()分为了两步: 先加载这个类,然后再实例化
不同之处是:
Class.forName可以使代码的耦合度降低
但是newInstance只能调用无参构造函数。但是new可以调用有参构造函数
输入java DynamicLoader B a1 a2 a3
输出
A static
B static
输入java DynamicLoader Echo a1 a2 a3
输出
Echo arg0 = Echo
Echo arg1 = a1
Echo arg2 = a2
Echo arg3 = a3
import java.lang.reflect.Method; public class DynamicLoader { /** * @param args */ public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub Class toRun = Class.forName(args[0]); //toRun.newInstance(); //Method mainMethod = finMain(toRun); //mainMethod.invoke(null, new Object[]{args}); } private static Method finMain(Class toRun){ Method[] methods = toRun.getMethods(); for(Method method : methods){ if(method.getName().equals("main")){ return method; } } return null; } } class Echo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub for(int i=0;i<args.length;i++){ System.out.println("Echo arg"+i+" = "+args[i]); } } } class A{ public A(){ System.out.println("init A"); } static{ System.out.println("A static"); } }
输入java DynamicLoader A a1 a2 a3
输出A static
如果把toRun.newInstance();这句话的注释去掉,输出
A static
init A
Class.forName与newInstance() 相当于把Class A=new A()分为了两步: 先加载这个类,然后再实例化
不同之处是:
Class.forName可以使代码的耦合度降低
但是newInstance只能调用无参构造函数。但是new可以调用有参构造函数
import java.lang.reflect.Method; public class DynamicLoader { /** * @param args */ public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub Class toRun = Class.forName(args[0]); //toRun.newInstance(); //Method mainMethod = finMain(toRun); //mainMethod.invoke(null, new Object[]{args}); } private static Method finMain(Class toRun){ Method[] methods = toRun.getMethods(); for(Method method : methods){ if(method.getName().equals("main")){ return method; } } return null; } } class Echo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub for(int i=0;i<args.length;i++){ System.out.println("Echo arg"+i+" = "+args[i]); } } } class A{ public A(){ System.out.println("init A"); } static{ System.out.println("A static"); } }
class B extends A{
public B(){
System.out.println("init B");
}
static{
System.out.println("B static");
}
}
输入java DynamicLoader B a1 a2 a3
输出
A static
B static
import java.lang.reflect.Method; public class DynamicLoader { /** * @param args */ public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub Class toRun = Class.forName(args[0]); toRun.newInstance(); Method mainMethod = finMain(toRun); mainMethod.invoke(null, new Object[]{args}); } private static Method finMain(Class toRun){ Method[] methods = toRun.getMethods(); for(Method method : methods){ if(method.getName().equals("main")){ return method; } } return null; } } class Echo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub for(int i=0;i<args.length;i++){ System.out.println("Echo arg"+i+" = "+args[i]); } } } class A{ public A(){ System.out.println("init A"); } static{ System.out.println("A static"); } }
输入java DynamicLoader Echo a1 a2 a3
输出
Echo arg0 = Echo
Echo arg1 = a1
Echo arg2 = a2
Echo arg3 = a3
相关文章推荐
- java异常分类
- Eclipse使用Maven创建Web时错误:Could not resolve archetype
- spring +cxf 发布webservice
- JAVAtwo 总结
- Java多线程学习(吐血超详细总结)
- Spring 一二事(5) - 依赖注入
- eclipse svn在线安装
- MyBatis There is no getter for property named 'xxx' in 'class java.lang.String'
- Java泛型的逆变
- Spring 一二事(4) - 单例
- 配置JDK+Jmeter环境变量
- java中newInstance()和new()
- SpringAOP笔记
- jdk安装及环境变量配置
- java Integer parseInt()
- Java学习笔记--四大核心
- Spring事务配置的五种方式
- java多线程状态
- Spring 一二事(3) - 别名
- eclipse从数据库获取数据时控制台乱码问题