Java Class.forname

Class.forName(xxx.xx.xx) 返回的是一个类,作用是要求JVM查找并加载指定的类。由于类与静态代码是绑定的,因此也会执行静态代码段。但是没有实例化。例如

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值