
java中获取一个对象可以使用单例模式,实例如下:
Class A:public class A {
public void SayHello() {
Systemoutprintln("Say Hello From Class A");
}
public static A getInstanceOfA() {
return new A();//A类中A的实例变量
}
private A(){}
}
Class B:
public class B {
public static void main(String[] args) {
A a = AgetInstanceOfA();//返回的是A类中的A的实例变量
aSayHello();//调用A中的SayHello方法
}
}
TgetClass()或者Tclass都是非法的,因为T是泛型变量。
由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。
有一种变通的实现方式:
import javalangreflectArray;
import javalangreflectParameterizedType;
import javalangreflectType;
public class Generic extends Base<String> {
public static void main(String[] args) {
Generic c = new Generic();
Systemoutprintln(carray);
}
Object array ;
public Generic() {
array = ArraynewInstance(getGenericType(0), 100);
}
}
class Base<T> {
public Class getGenericType(int index) {
Type genType = getClass()getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Objectclass;
}
Type[] params = ((ParameterizedType) genType)getActualTypeArguments();
if (index >= paramslength || index < 0) {
throw new RuntimeException("Index outof bounds");
}
if (!(params[index] instanceof Class)) {
return Objectclass;
}
return (Class) params[index];
}
}
其中Base<T>是泛型类,在父类中声明getGenericType,子类继承具体的Base<String>,那么在子类中就可以通过getGenericType(0)获取到String的class
Java反射机制是一个非常强大的功能,在很多大型项目比如Spring,Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。下面java课程>
反射基础
ps:本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的QuickStart。
在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。
通过getClass方法
在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类:
Strings="ziwenxie";
Class<>c=sgetClass();
通过forName方法
我们也可以调用Class类的静态方法forName:
Class<>c=ClassforName("javalangString");
使用class
或者我们也可以直接使用class:
Class<>c=Stringclass;
获取类型信息
在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。
首先我们在typeinfointerfacea包下面新建一个接口A:
packagetypeinfointerfacea;
publicinterfaceA{voidf();}
接着我们在typeinfopackageaccess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。
java是不支持在运行中进行强制转化的! 如果事先知道类型,可以通过强制转化实现! 如果不知道! 可以采用这种方式!
String className = objgetClass()getName(); 得到类名
然后:
A a = (A)ClassforName(className)newInstance();
//上面这句话的意思是,forName(className):静态加载className这个类;
// newInstance(),实例化一个对象
// A 代表你知道的这人类或者这个类的父类, 把强制转化成你所要的对象。
这和你
A a = new A();
是一样的效果!
java中创建对象时其实不是通过类直接创建的,如果你想要使用Test类,在java中JVM首先加载Testjava文件的字节码文件Testclass(也就是编译后的文件),当JVM(java虚拟机)加载字节码文件后,自动为该类创建自己的class对象,在通过class对象创建你以后要创建的对象\x0d\例如:Test t1=new Test(); Test t2=new Test(); 我们都知道java中 == 是比较两个对象的内存地址,t1getClass()==t2getClass();返回是true,证明他们是一个class对象创建出来的。那么可Class对象的意义就是标志一个类了,Class类为我们提供了很多方法,比如反射技术常用到的ClassforName("包类");这样可以获取一个类的Class对象。\x0d\例如:Test类在orgabc这个包里,那么可以用ClassforName("orgabcTest");这样就返回一个Test类的class对象,拿到这个对象接下来可以做很多事,调用这个类的方法,属性,构造方法等,具体你去研究下反射技术。如果有不懂在问我。\x0d\针对一种数据类型的Class转换,比如Stringclass,intclass,类class等\x0d\你提出的问题Class参数,就是让你传一种Class对象进去。比如Stringclass,intclass,类class等\x0d\Testclass==t1getClass();返回true,怕你有误解,说明一下类和对象都可以获取class对象的。并且这个对象是一个对象,因为一个类对应自己的class对象。
以上就是关于java怎样获得一个对象的类型全部的内容,包括:java怎样获得一个对象的类型、在java中,使用泛型,比如说T,但是T.class就要报错。我想获取T的class对象怎样获取啊。、java课程分享Java的反射机制等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)