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

Java Class.forname

2016-03-22 11:08 417 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: