Java静态方法获取所属类的信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java静态方法获取所属类的信息相关的知识,希望对你有一定的参考价值。

我在一个类中有一个静态方法method(),在方法体内部想获取当前所属类的类型信息,该如何实现?

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

下面通过实际的例子说明如何在运行时动态访问类的静态方法。
参考技术A 静态方法method(),只能把属性也要设置成static的,才能访问到你的属性

但是你的目的:在方法体内部想获取当前所属类的类型信息

建议你可以这样:举个小例子

class demo

private int num;
public demo()

public int getNum()

return this.num;
//这个方法就很轻松的获取你的属性的信息;



o(∩_∩)o...希望你明白...
参考技术B 在非静态方法中可以通过
this.getClass()获得类型信息。
而在静态方法中没有隐含的this,是没办法获取类型信息的,严格来说,静态方法不属于某个类,自然就不会有“所属类”的信息了。
参考技术C 现在如果我们想要获取所有的方法(Method),那么我们可以使用 Type类的FindMembers()方法:

MemberInfo[] memberInfo = t.FindMembers(
MemberTypes.Method, // 说明查找的成员类型为 Method
BindingFlags.Public |
BindingFlags.Static |
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.DeclaredOnly,
Type.FilterName,
"*"
);

Type.FilterName 返回一个MemberFilter类型的委托,它说明按照方法名称进行过滤,最后一个参数“*”,说明返回所有名称(如果使用“Get*”,则会返回所有以Get开头的方法)。现在的输出如下

java反射

Java运行时刻,能否知道一个类的属性方法并调用改动之?对于任意一个对象,能否知道他的所属类,并调用他的方法?答案是肯定的。这种动态的获取信息及动态调用方法的机制在Java中称为“反射”(reflection)。

Java反射机制主要提供以下功能:

在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法。

      Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods 的所有信息,并可于运行时改变fields内容或调用methods。

一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类;
Field 类:代表类的成员变量(成员变量也称为类的属性);
Method类:代表类的方法;
Constructor 类:代表类的构造方法;
Array类:提供了动态创建数组,以及访问数组的元素的静态方法;

Class

       在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法:
getName():获得类的完整名字;
getFields():获得类的public类型的属性;
getDeclaredFields():获得类的所有属性;
getMethods():获得类的public类型的方法;
getDeclaredMethods():获得类的所有方法;

getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型;

getConstructors():获得类的public类型的构造方法;
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型;
newInstance():通过类的不带参数的构造方法创建这个类的一个对象;

         Class class十分特殊。它和一般classes一样继承自Object,其实体用以表达Java程序运行时的classesinterfaces,也用来表达enumarrayprimitive Java typesboolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()JVM调用,JVM 便自动产生一个Class object。如果您想借由修改Java标准库源码来观察Class object的实际生成时机(例如在Classconstructor内添加一个println()),不能够!因为Class并没有public constructor
         ClassReflection起源。针对任何您想探勘的class,唯有先为它产生一个Class object,接下来才能经由后者唤起为数十多个的Reflection APIs




















以上是关于Java静态方法获取所属类的信息的主要内容,如果未能解决你的问题,请参考以下文章

静态对象成员会在所属类的析构函数被调用时自动析构吗?

Java 反射基础

Java:从静态方法中获取继承类的类

继承中静态方法不能被重写

static变量和方法

基本的编程结构