
class获得的是类的Class对象,可不是这个类的对象,用Class 变量名接收,用这个Class对象通过反射机制可以通过newInstence创建出这个类的对象而且只能调用无参数构造器
List<Object> list = new ArrayList<Object>();
listadd(new String("aaa"));
Systemoutprintln(listget(0)getClass()getName());
输出的值是javalangString,这样就能取得泛型的具体类型,不知道你是不是要这个意思
在父类的构造方法中,获取泛型的具体类型
import javalangreflectParameterizedType;
import javalangreflectType;
import comopensymphonyxwork2ModelDriven;
/
工具类直接返回ModelDriven的对象
/
public class ModelBaseAction<T> extends BaseAction implements ModelDriven<T> {
protected T model;
/
通过反射,获取泛型的具体类型并实例化这个类型
/
public ModelBaseAction() {
// 获取反射的类型
javalangreflectType cls = supergetClass()getGenericSuperclass();
if (cls instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) cls;
// 获取所有放到泛型里面的类型
Type[] tps = ptgetActualTypeArguments();
Systemerrprintln(tps[0]getTypeName());
try {
// 实例化这个泛型所代表的类对象
model = (T) ClassforName(tps[0]getTypeName())newInstance();
} catch (Exception e) {
throw new RuntimeException("没有默认构造方法", e);
}
}
}
@Override
public final T getModel() {
return model;
}
}
对于java传递进来的java对象模型,c要加载java类的原型,根据创建相应的c对象,获取java对象的方法的id,然后调用java对象的方法。比如有个java类customer对象作为jni参数传递到c程序,customer有方法String getName()。
JNIEXPORT jobject JNICALL Java_com_oracle_estt_sc_db_impl_SCQueryODBC__1getCustomer
(JNIEnv env, jobject, jobject customer){
jmethodID methodId;
//获得customer对象的句柄
jclass cls_objClass=env->GetObjectClass(customer);
//获得customer对象中特定方法getName的id
methodId=env->GetMethodID(cls_objClass,"getName","()Ljava/lang/String;");
//调用customer对象的特定方法getName
jstring js_name=(jstring)env->CallObjectMethod(customer,methodId,NULL);
}
然后C向java传递对象方法如下:
JNIEXPORT jobject JNICALL Java_perfecter_jni_LoadJni_getJavaObj(JNIEnv env,
jobject obj){
jclass clazz=env->FindClass("perfecter/jni/MyObj");
if(clazz==0)
return 0;
jobject jobj=env->AllocObject(clazz);
jfieldID fieldId=env->GetFieldID(clazz,"name","Ljava/lang/String;");
env->SetObjectField(jobj,fieldId,env->NewStringUTF("wahaha"));
return jobj;
}
java对应的native方法申明public static native MyObj getJavaObj();
字节码对象是无法直接获取这个类型的,不过Class类中有几种方法你可以参考一下:
isInstance(Object obj)
如果obj是这个字节码对象的子类或者实现类,或者就是这个类的对象,那么直接返回true。
isAssignableFrom(类<> cls)
确定由此类对象表示的类或接口是否与由指定的Class
类表示的类或接口相同或是超类或类接口。
Class类无构造方法,获取Class类的实例有三种方法。
(1) 利用对象调用getClass()方法获取该对象的Class实例。
(2) 使用Class类的静态方法forName(),用类的名字获取一个Class实例:forName()方法定义如下:
public static Class forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException
(3) 运用 class 的方式来获取Class实例,对于基本数据类型的封装类,还可以采用 TYPE 来获取相应的基本数据类型的Class实例。
用一个例子给你说明一下:
比如“人类”就是一个类,那么具体的某个人“张三”就是“人类”这个类的对象,而“名字、年龄”等信息就是对象的属性,人的动作比如“吃饭、穿衣”等就是对象的方法。总之类就是有相同特征的事物的集合,而对象就是类的一个具体实例。同时类有多态和继承,例如“人类”可以分为“男人、女人”,“老人、小孩”那么“男人、女人”就是“人类”的子类等等。一楼的说“轿车”是一个实例化,我觉得有点不妥,“轿车”应该是“车”的一个子类,例如“车牌号是的轿车”才是一个对象。方法是被对象调用的比如“张三穿衣()”,用static修饰的方法是静态的方法或称为共享方法,一般用类名直接调用。
以上就是关于Java中类名.class获得当前类的对象,如果这个类实例化了很多对象呢会获得哪一个全部的内容,包括:Java中类名.class获得当前类的对象,如果这个类实例化了很多对象呢会获得哪一个、如何获得java 泛型类中t的实例、Java问题,泛型问题,通过实例对象获取T的类型如:public class Base<T>{}等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)