-
Java中如何获得一个对象所对应的类及Class类的简单理解
2018-08-09 19:57:10Java中如何获得一个对象所对应的类及Class类的简单理解 前言 在之前的学习中,所用的编程语言主要是Python,最近开始学习Java,熟悉Python的同学应该会知道在Python中有一个函数type(),通过这个函数可以非常...Java中如何获得一个对象所对应的类及Class类的简单理解
前言
在之前的学习中,所用的编程语言主要是Python,最近开始学习Java,熟悉Python的同学应该会知道在Python中有一个函数
type()
,通过这个函数可以非常方便地获得一个变量的类型。那么在Java中可不可以实现类似的功能呢?答案当然是可以的,一个比较简单的方法就是利用Java中Class类来实现。利用Class类的方法获得一个对象所属于的类
在这里先给出一个例子:
List<Integer> listTest = new ArrayList<>(); System.out.println(listTest.getClass().getName());
运行这段代码会输出:
java.util.ArrayList
在这一段代码中,新建了一个
ArrayList
类型的实例listTest
,在其后的一行代码中,用.getclass()
方法获得了listTest
变量所属于的类,并再用.getName()
将这个类的名称输出出来。
同时,也可以用.toString()
将完整的信息打印出来:System.out.println(listTest.getClass().toString());
结果为
class java.util.ArrayList
可以看到,用
.getClass()
方法可以很方便地获得我们想要知道的对象变量所对应的类的名称。
而以上是用于实例的获取其类的类型的方法,与之类似的还有.class()
方法,这个方法是针对类的,如:System.out.println(ArrayList.class.getName());
输出为:
java.util.ArrayList
关于Class类的一些理解
在上面的例子中,我们看到
Class
类有一些非常方便的应用,所以可以来简单地了解以下Class
类的内容。java是一门比较纯粹的面向对象的语言,在这样一门语言里,一切皆为对象。当然还是有着一些例外,比如从开发者的角度看静态成员和普通数据类型就不属于对象,静态成员只属于某个类,而不属于对象,而普通数据类型是因为处于对性能的考虑,因为处理对象需要额外的系统开销,所以颗将基本数据类型当作对象,就会给语言性能带来负面影响,因此,在Java中基本数据类型是不作为对象来使用的,不过,在需要的时候可以通过方便的装箱(boxing)与开箱(unboxing)来实现基本数据类型与对象之间的转换。
当然,既然上面说了是从开发者的角度看,肯定对应着其它的角度,比如若在JVM的视角,会将所有的原始类型都当作对象处理,但是会为原始类型创建非常轻量级的对象,相比于其装箱的包装类的功能要少得多,但是会有很多优化。而对于静态成员,就可以通过Class类来进行理解。
那么,既然Java中,一切皆为对象,那么在程序里的类本身是不是对象呢?答案为是的,在Java中有这样专门的一个类
java.lang.Class
,在程序中所写的每一个类都既有着自己的对象,同时它自己本身也是Class
类的对象。
在Java中,程序运行的期间,Java的运行时系统会始终为所有的对象维护一个被称为运行时的类型标识,这个信息跟踪着每个对象所属的类,虚拟机则利用女性是类型信息来选择相应的方法执行,而保存这些信息的类就是Class
类。而在之前我们的例子中的的.getClass()
方法返回的就是这样一个Class
类型的实例,获得Class类的方法主要有以下三种:-
Object
类中的getClass()
方法 -
Class
类中的forName()
方法,例:Class cl = Class.forName(className);
输入参数为雷鸣,获得类名对应的Class对象。 -
如果T是任意的Java类型,则
T.class
返回匹配的类对象。
其中的1、3条即为本文开始时的两个例子。
在这里,需要注意的一点时,一个Class对象实际上上表示的是一个类型,而这个类型未必一定是一种类,如int不是类,但int.class是一个Class类型的对象。
Class类还有其它一些比较有用的地方,比如,虚拟机为每个类型管理一个Class对象,因此,可以利用
==
运算符实现两个类对象比较的操作,如:if (e.getClass() == Employee.class)...
还有一个很有用的方法
newInstance()
,可以用来动态地创建一个类的实例。例如:e.getClass().newInstance();
这个语句创建了一个与
e
具有相同类的类型的实例。newInstance方法调用默认的构造器(没有参数的构造器)初始化新创建的对象。如果这个类没有默认的构造器,就会抛出一个异常。将
forName
与newInstance
配合使用,可以根据存储在字符串中的类名创建一个对象。String s = "java.util.Random"; Object m = Class.forName(s).newInstance;
同时,还需要知道,
Class
类的构造函数为私有函数,即我们无法像定义普通类的实例那样,用new
的方法来构造Class
的实例,若要获得Class
的实例可以通过上面介绍的三种方法。 -
-
如何获得一个对象的类型?
2012-07-26 09:28:55我写了以下的代码: object a=1; object b="hello"; Type t1=a.GetType(); Type t2=b.GetType(); 得到的t1类型为int ,t2类型为string ...我是想知道我定义的是object类型的,为什么返回是上面的类型的呢? -
如何获得一个对象的引用的类型
2009-07-26 11:28:00如何写一个方法,得到obj的引用的类型为Father,而其本身的类型为Son呢? 以前只知道调用obj.GetType()就得到了其自身的类型Son,但是一直不知道怎么得到其引用的类型,这两天不经意间研究出来了一个方法: vo很早就有一个疑问:
class Father
{
}
class Son:Father
{
}
Father obj=new Son();
如何写一个方法,得到obj的引用的类型为Father,而其本身的类型为Son呢?
以前只知道调用obj.GetType()就得到了其自身的类型Son,但是一直不知道怎么得到其引用的类型,这两天不经意间研究出来了一个方法:
-
iOS ARC模式下,如何获得一个对象的引用计数器个数
2018-03-01 10:25:56printf("obj count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));printf("obj count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
-
如何获得一个类的Class对象
2013-08-28 18:32:16how to get Class object of a class import java.util.HashSet; import java.util.Set; public class retrieveClash { /** * @param args ... public static void main(String[] args) { // TODO Auto-genhow to get Class object of a class
import java.util.HashSet; import java.util.Set; public class retrieveClash { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Set<String> s = new HashSet<String>(); Class c = s.getClass(); //有包要含包名 try { Class c2 = Class.forName("diu"); System.out.println(c2.getName()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(c); } } class diu{}
-
关于反射获得一个对象的引用,然后再另一个地方,如何获取这个对象的数据成员
2012-04-14 23:45:46下面一个是获取这个对象的引用,获取它的数据成员的方法 void receive_1(ObjectReference r){ B second_b = new B(); //由传过来的r建立新的对象 Field t1 = or.referenceType().fieldByName("name"); Value ... -
new 一个对象时如何获得泛型?
2010-11-11 18:51:48一般通常用 ((ParameterizedType) getClass...也就是 getGenericSuperclass() 方法去拿泛型 ,通过名字我们的得知,这个拿的是 父对象的泛型 super class generic 自然 理论上在 new时 是无法的得到泛型的。。。。... -
如何创建一个对象
2013-03-14 20:12:29除了new一个。 还可以用反射。 继续问你:还可以怎样获得? 真心不知道了啊 可能是想问设计模式吧,从工厂里获取。 或者问框架、容器,从spring容器中获取。... -
Lisp获取偏置后对象的坐标点_[讨论]如何获得一个对象其正确的在UCS中的边界坐标?...
2020-12-21 04:44:40SignatureRetVal = object.TranslateCoordinates(OriginalPoint, From, To, Disp[, OCSNormal])ObjectMSITStore:\Program%20Files\AutoCAD%202005\help\acadauto.chm::/idh_utility_object.... -
如何获得一个JDT 的 JavaProject 对象,在不使用eclipse 平台不启动的情况
2014-01-27 09:16:34JDT中提供的获取IJavaProject对象的方法是: ①先从workspace中获取...简单的说,在Eclipse不启动的情况,基于JDT API能否自己构建一个IJavaProject对象 或者是通过eclipseAPI 自己构建一个 IProject 。 请大神指点! -
unity如何得到所有子对象_在Unity中获得一个物体的所有子物体包括孙物体。
2020-12-20 14:15:59看API时想到了这个问题,如何获得一个物体的所有子物体,在Unity的API有这个函数Component.GetComponentsInChildren 获取子物体组件列表。首先是在Unity软件中创建了如图的物体。 然后创建了一个C#脚本,并把脚本拖... -
如何获得父窗口对象
2010-04-12 13:19:35现有一个main.jsp 页面中是一个frameset 框架 包含left.jsp right.jsp 如何在left.jsp中获得main.jsp文档对象并修改其中内容. 一句话: window.top.document -
queryRuner如何获得bean对象,当这个bean对象中包含其他对象的时候
2016-08-17 19:15:00但是,当我们在一个表和另一个表关联的时候,往往喜欢将另一个表的关联字段变成另一个bean的对象,那么BeanHandler就无法为该对象赋值了。 怎么解决呢? 使用MapHandler,得到所有结果的map,然后再map中提取出... -
python mock一个类_你如何模拟修补一个python类并为每个实例化获得一个新的Mock对象?...
2021-01-14 16:02:14这是一个让你前进的快速例子:import mockimport unittestclass ClassToPatch():def __init__(self, *args):passdef some_func(self):return id(self)class UUT():def __init__(self, *args):resource_1 = ... -
如何获得JavaScript对象的大小?
2019-10-09 09:48:52如何获得JavaScript对象的大小?下面本篇文章就来给大家介绍一下获得JavaScript对象大小的方法,希望对大家有所帮助。 我们可以在Object.keys()方法和length属性的帮助下获得java脚本对象的大小。Object.keys() ... -
如何获得Bundle对象
2015-10-16 16:17:38今天看见一个极光推送的demo 自定义receiver,重写了oncreate()方法,在其中通过intent判断接收广播的状态。 关键来了: 其中的bundle是这样获取的。 Bundle bundle = intent.getExtra(); -
如何对Java对象的属性及其值按照ASCII码顺序获得一个用于签名或传参的连接字符串
2019-08-07 11:51:55有时候我们通信的时候要对参数进行签名,以防止在通信过程中被篡改,在Java编程中,对Java对象的属性及其值按照ASCII码顺序获得一个字符串,用来进行签名,那么方法可以按照下面来进行。 -
求教下,object是一个动态类对象,如何获得值
2012-09-02 19:40:36有一个object,在程序里接受客户端传入的类对象,可能是一个USER类,也可能是CUSTOMER类,这个根据调用的时候动态传入的。 现在我想根据传入的类,获得类的字段值。比如object是USER类,所以我想获得USER.ID,USER... -
纯javascript,如何用的一个自定义属性获得此对象。
2014-03-15 19:07:20都是必须有一个id属性,才能获得这个对象。 attributes:获取一个属性作为对象 getAttribute:获取某一个属性的值 var d = document.getElementById("id").attributes["data-id"]; 都是类似这样的。可...