Java中类名.class获得当前类的对象,如果这个类实例化了很多对象呢会获得哪一个

Java中类名.class获得当前类的对象,如果这个类实例化了很多对象呢会获得哪一个,第1张

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>{}等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9394057.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存