1、Test t = new Test()Class clazz = tgetClass()Systemoutprintln(clazzgetCanonicalName())Systemoutprintln(clazzgetSimpleName())
2、public class TestReflect {public static void main(String[] args) throws Exception {TestReflect testReflect = new TestReflect()Systemoutprintln(testReflectgetClass()getName())// 结果 netxsoftlabbaikeTestReflect}}
3、Java程序
在JAVA中动态执行类的静态方法
/
在JAVA中,通过ClassforName()方法可以动态决定加载哪一个类,这个功能对于相同接口的不同实现来讲非常有用。比如对于设计好的数据库连接池接口,我们可以有多种的接口实现类来完成相同的功能,同时用户可以简单的通过修改配置文件来指定实际使用哪一个实现类,在源代码里面通过读取配置文件信息,并用ClassforName(configClassName)getInstance()就可以构造一个特定的实现类实例,而不用每次修改源代码。这样对于程序来讲只用关心接口的定义,用户只用进行配置文件的设置就完成了同一功能的不同实现的切换。
但是如果实现类需要通过静态方法来进行初始化的时候,动态加载的过程就会复杂一些。同样的以数据库连接池为例,通常连接池的构造函数都会被定义为私有的,而通过自定义的getInstance()静态方法来得到唯一实例。这种情况下简单的通过ClassforName()getInstance()就无法正确构造实例。
幸好JAVA所提供的反射机制(Reflection)为我们提供了完整了探悉类内部结构的方法。通过反射机制,我们能够完成基本上所有的运行时决定的动作(虽然这一实现要比其他动态语言,比如PHP,的eval()的使用要复杂的多)。
下面通过实际的例子说明如何在运行时动态访问类的静态方法。
java中是可以多继承的,所以子类获得父类的类名,可以使用getSuperClass()这个方法来获得,示例如下:
public class Test1 extends Date {public static void main(String[] args) {
new Test1()test();//测试获得父类类名方法
}
public void test() {
Systemoutprintln(Test1classgetSuperclass()getName());//打印父类类名,使用getSuperclass()方法
}
}
可以用到java反射机制,Class和Method这些类。 动态调用的方法:agetClass()getMethod(str, new Class[]{})invoke(a, new Object[]{})
其中,a为类的对象,str为要被调用的方法名 。
1、agetClass()得到aclass 对象 ;
2、getMethod(str, new Class[]{})得到a对象中名为str的不带参数的方法;
如果str方法带参数如str(String s, int i),就要这样写getMethod(str, new Class[]{Stringclass,intclass}) 。
3、invoke(a,new Object[]{})调用方法,第一个参数是要调用这个方法的对象,如果方法是static的,这个参数可以为null
如果调用有参数的方法str(String s, int i),应该这样写:invoke(a,new Object[]{"jimmy", 1})。
用反射.
比如说现在有一个Test类的引用t
Class c=tgetClass();
类名为cgetName();
结果中包括包的名.如果不想要包的名,自己处理下
Class类在javalang包
给你写了3个类:
A类:
package cntest;public class A {
public void test(){
Systemoutprintln(thisgetClass());
Systemoutprintln(thisgetClass()getSimpleName());
Systemoutprintln(thisgetClass()getName());
}
}
B类:
package cntest;public class B extends A{
}
Test类:
package cntest;public class Test {
/
@param args
/
public static void main(String[] args) {
B b = new B();
btest();
}
}
结果:
class cntestB
B
cntestB
你要知道,在继承关系中,不管父类还是子类,这些类里面的this都代表了最终new出来时的那个类型的实例对象,所以在父类中你可以中this获取到子类的信息!
不止一层继承关系时,你可以根据下面:
A类:
package cntest;public class A {
public void test(){
Systemoutprintln(thisgetClass());
Systemoutprintln(thisgetClass()getSimpleName());
Systemoutprintln(thisgetClass()getName());
Systemoutprintln(thisgetClass()getSuperclass());
Systemoutprintln(thisgetClass()getSuperclass()getSimpleName());
Systemoutprintln(thisgetClass()getSuperclass()getName());
}
}
B类:
package cntest;public class B extends A{
B(){
// Systemoutprintln("B");
}
}
C类:
package cntest;public class C extends B{
C(){
// Systemoutprintln("C");
}
}
Test类:
package cntest;public class Test {
/
@param args
/
public static void main(String[] args) {
C c = new C();
ctest();
}
}
结果:
class cntestC
C
cntestC
class cntestB
B
cntestB
以上就是关于利用java反射机制,通过一个对象获得完整的包名和类名全部的内容,包括:利用java反射机制,通过一个对象获得完整的包名和类名、Java静态方法获取所属类的信息、java,在子类里面如何获取父类的类名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)