`

在JAVA中动态执行类的静态方法

阅读更多

在JAVA中动态执行类的静态方法

/*
在JAVA中,通过Class.forName()方法可以动态决定加载哪一个类,这个功能对于相同接口的不同实现来讲非常有用。比如对于设计好的数据库连接池接口,我们可以有多种的接口实现类来完成相同的功能,同时用户可以简单的通过修改配置文件来指定实际使用哪一个实现类,在源代码里面通过读取配置文件信息,并用Class.forName(configClassName).getInstance()就可以构造一个特定的实现类实例,而不用每次修改源代码。这样对于程序来讲只用关心接口的定义,用户只用进行配置文件的设置就完成了同一功能的不同实现的切换。
但是如果实现类需要通过静态方法来进行初始化的时候,动态加载的过程就会复杂一些。同样的以数据库连接池为例,通常连接池的构造函数都会被定义为私有的,而通过自定义的getInstance()静态方法来得到唯一实例。这种情况下简单的通过Class.forName().getInstance()就无法正确构造实例。
幸好JAVA所提供的反射机制(Reflection)为我们提供了完整了探悉类内部结构的方法。通过反射机制,我们能够完成基本上所有的运行时决定的动作(虽然这一实现要比其他动态语言,比如PHP,的eval()的使用要复杂的多)。

下面通过实际的例子说明如何在运行时动态访问类的静态方法。
-------------------------------------------------------

*/
import java.lang.reflect.*;

public class myTestClass{
    private static Object pLock = new Object();

    private static myTestClass p_instance = null;
    private String s_configName = "";
    private boolean b_isFromResource = true;

    public static Object getInstance(String sConfigName,
                                        Boolean bIsFromResource){

        synchronized(pLock){
            if(null == p_instance){
                p_instance
=
                    new myTestClass(sConfigName,bIsFromResource);
            }
        }

        return p_instance;
    }


    private myTestClass(String sConfigName,Boolean bIsFromResource){
        s_configName
= sConfigName;
        b_isFromResource
= bIsFromResource.booleanValue();
    }


    public void echoInfo(){
        System.out.println(
"current arguments : configName=["+
                            s_configName
+"],isFromResource=["+
                            b_isFromResource
+"]");
    }


    public static void main(String[] args) throws Exception{
        // 设置方法的传入参数的类型.
        Class[] parameterTypes = new Class[]{
                                    java.lang.String.
class,
                                    java.lang.Boolean.
class
                                    };

        Method mGetInstance
= null;
        String className
= "myTestClass";

        Class curTestClass
= Class.forName(className);
        try{
            mGetInstance
= curTestClass.
                            getMethod(
"getInstance",parameterTypes);
        }

        catch(NoSuchMethodException e){
            e.printStackTrace();
            mGetInstance
= null;
        }


        if(mGetInstance != null){

            myTestClass pObj
= (myTestClass)
                                mGetInstance.invoke(

                                    null,
                                    new Object[]{
                                        "src/myconfig.properties",
                                        Boolean.FALSE
                                    }
                                );

            pObj.echoInfo();
        }

        else{
            throw
            new Exception("myTest Init Failed from class" +
                                className
+
                                System.getProperty(
"line.seperator","\n") +
                                "method getInstance(String, Boolean) exists.");
        }
    }
}

 

分享到:
评论

相关推荐

    Java中的静态变量静态方法静态块与静态类.docx

    Java 中的静态变量、静态方法、静态块和静态类 Java 中的静态变量、静态方法、静态块和静态类是 Java 编程语言的四个重要概念,它们之间存在着紧密的关系。下面将对这四个概念进行详细的介绍。 一、静态变量...

    Java中的Static块与静态方法

    在Java编程语言中,`static`关键字扮演着至关重要的角色,它被用于声明类成员(如变量、方法)为静态的。静态成员不依赖于任何特定的对象实例,而是与类本身绑定,这意味着无论该类有多少个实例,静态成员只会有一份...

    java 利用反射获取内部类静态成员变量的值操作.docx

    在Java编程中,反射是一个非常强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够创建和操作对象。本文将详细介绍如何使用Java反射技术来获取内部类中的静态成员变量的值。 #### 二、背景...

    Java动态绑定和静态绑定.doc

    在Java编程语言中,动态绑定和静态绑定是两个重要的概念,它们涉及到方法调用和多态性。了解这两个概念对于深入理解面向对象编程至关重要。本文将详细探讨它们的区别,并通过实例来阐述它们的工作原理。 首先,让...

    Java中静态方法和非静态方法的区别.docx

    在非静态方法中,该方法使用运行时或动态绑定。这样我们就无法在不创建实例的情况下访问非静态方法。 六、覆盖 在静态方法中,由于它可以重写任何静态数据成员的值,因此静态方法可以覆盖静态变量的值。非静态方法...

    通过反射调用静态方法

    在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段以及方法等对象。本文将详细讲解如何通过反射调用静态方法,并探讨在特定场景下,如MyBatis中的应用。 首先,理解反射的概念是至...

    java 静态代码块通过类加载器获取资源文件例子

    在Java编程中,静态代码块(Static Block)和类加载器(Class Loader)是两个重要的概念,它们在软件开发中有着广泛的应用。本案例聚焦于如何利用静态代码块结合类加载器来高效地获取资源文件,尤其是属性配置文件。...

    Java静态代理和动态代理

    与静态代理不同,动态代理在程序运行时生成,利用Java的反射API动态创建代理类。动态代理适用于那些在运行时才知道需要代理的对象或者代理行为的情况。Java提供了`java.lang.reflect.Proxy`类和`java.lang.reflect....

    jni调用java静态方法

    在上面的代码中,`FindClass()`用于获取Java类的`jclass`对象,`GetStaticMethodID()`用于获取静态方法的ID,最后`CallStaticVoidMethod()`执行静态方法。注意检查可能的错误,如找不到类或方法,并处理可能出现的...

    实用技术在Android 应用中调用 C++ 代码并在新线程中执行 Java 静态方法

    这是 Kotlin 语言编写...这个接口函数的作用是创建新线程,并在新线程中调用 callJavaStaticMethod 方法,这个方法会获取当前线程的 JNIEnv 对象和 Java 类对象,并通过这些对象调用 Java 层的静态方法 staticMethod。

    JAVA静态代理和动态代理

    相比静态代理,动态代理更加灵活,因为它是在运行时动态创建代理类。Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了动态代理的支持。 1. 定义接口: ```java public ...

    Java类动态加载(一)——java源文件动态编译为class文件

    在Java编程中,类动态加载是一项重要的技术,它允许程序在运行时根据需要加载新的类,从而提高了灵活性和可扩展性。这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时...

    java笔记静态成员

    在上面的代码中,`public static void main(String [] args)`是一个静态方法,它是java程序的入口点。 3、静态初始化块 静态初始化块是指在类加载时被执行的代码块,它们用于初始化静态变量。在上面的代码中,静态...

    Java静态代理与动态代理demo

    在动态代理中,我们创建了一个 `DynamicProxy` 类实现 `InvocationHandler` 接口,然后使用 `Proxy.newProxyInstance()` 方法创建代理对象。`invoke()` 方法会拦截所有对代理对象的方法调用,从而可以在调用前后添加...

    Java中的静态绑定和动态绑定Java开发Java经验技巧

    在Java编程语言中,静态绑定和动态绑定是两个至关重要的概念,它们关乎程序的执行效率和灵活性。了解这两个概念对于提升Java开发技能至关重要。 首先,我们来解释一下静态绑定(也称为早期绑定)。静态绑定主要涉及...

    java中静态与非静态的区别

    例如,在进行单元测试时,可以将测试主方法放置在静态内部类中,以避免为每个Java源文件都添加主方法。 2. **使用限制**: - 定义为静态的内部类有一些限制,比如不能访问外部类的非静态成员。这是因为静态内部类...

    java面试题静态加载顺序构造方法

    2.我们发现main()方法在X类中,要执行main()方法,还得先将X类加载到内存中。 3.X类加载完成后,会做什么事情呢?别急,先来看看static的作用,不知道吧。告诉你:static就是在类被第一次加载的时候执行,以后就...

    webservice的动态调用和静态调用

    在开发中,我们通常会遇到两种调用方式:动态调用和静态调用。这两种方法各有特点,适用于不同的场景。 静态调用是通过在项目中添加Web引用或者服务引用来实现的。这种调用方式在编译时就已经确定了服务接口,因此...

    Java web 动态网页与静态网页

    在IT行业中,动态网页与静态网页是Web开发的两个重要概念。动态网页是基于服务器端编程技术,如Java,能够根据用户输入或特定条件实时生成内容的网页。而静态网页则是预先编写好,内容固定不变,每次用户请求时直接...

Global site tag (gtag.js) - Google Analytics