Java反射之查找一个类

原创 2017年12月07日 21:43:20

Java里面的类型是一个引用或者一个基本类型,类、枚举、或者数组都是继承于java.lang.Object,它们和接口一样都是引用类型,对于这些类型,JVM提供了方式可以在运行中获取对象对应类型,也就是它属于哪个Class。java.lang.class也提供了创建Class和Class对应的对象的方式。

本文讲一下目前有哪儿些方式可以获取到一个类(Class)。

所有的反射操作的切入点都是java.lang.Class,这也印证了Java是面向对象编程语言,在包java.lang.reflect中,除了 java.lang.reflect.ReflectPermission之外都没有public的构造方法,为了得到这些类,需要在java.lang.Class上调用对应的方法。

Object.getClass()

引用对象可以调用getClass()方法获取到它的类。

Class c = "foo".getClass();
System.out.println(c);//class java.lang.String

Class c = System.out.getClass();
System.out.println(c);//class java.io.PrintStream

byte[] bytes = new byte[1024];
Class c = bytes.getClass();
System.out.println(c);//class [B

Set<String> s = new HashSet<String>();
Class c = s.getClass();
System.out.println(c);//class java.util.HashSet

这里要注意是的通过接口的引用调用其getClass()方法是返回引用对象的真正类,而不是接口的名称。
数组对象的Class会以“[”开头。

.class

.class的方式是使用Class本身调用.class获取。
比如:

boolean b;
Class c = b.getClass();   // compile-time error
Class c = boolean.class;  // boolean

Class c = java.io.PrintStream.class;//class java.io.PrintStream
Class c = int[][][].class;//class [[[I

Class.forName()

forName()是声明异常类方法,如果找不到这个类会抛出java.lang.ClassNotFoundException异常。
比如:

Class c = Class.forName("com.duke.MyLocaleServiceProvider");
Exception in thread "main" java.lang.ClassNotFoundException: com.duke.MyLocaleServiceProvider
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at reflect.Main.main(Main.java:8)

如果能找到类:

Class cDoubleArray = Class.forName("[D");
Class cStringArray = Class.forName("[[Ljava.lang.String;");

基础类型包装类的TYPE属性

基础类型的包装类都有一个TYPE属性,和包装类的Class是一样的。

Class c = Double.TYPE;
Class c = Void.TYPE;

其他方式

Class.getSuperclass()

获得当前类的父类。

Class.getClasses()

返回当前类的内部定义的类、接口、枚举类型。

Class.getDeclaredClasses()

返回当前类中显式声明的接口、枚举类型。

引申

Class.getDeclaringClass()方法可以引申出另外几个方法:
java.lang.reflect.Field.getDeclaringClass()
java.lang.reflect.Method.getDeclaringClass()
java.lang.reflect.Constructor.getDeclaringClass()
作用和Class.getDeclaredClasses()一样,只是作用于的类型不一样,分别是Field、Method、Constructor。

Class.getEnclosingClass()

返回当前类的封闭类,也就是包含这个类的类,比如:

Class c = Thread.State.class.getEnclosingClass();
System.out.println(c);//class java.lang.Thread
版权声明:本文为博主原创文章,转载请注明出处,欢迎大家来一起交流。

Java反射实现接口

版权声明:本文为博主原创文章,未经博主允许不得转载。 转自: http://blog.csdn.net/lastwarmth/article/details/49466899 之前做过一个插...
  • leslietuang
  • leslietuang
  • 2016年04月20日 20:11
  • 5411

Java反射获取类和对象信息全解析

反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题。在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了。获取类对象 Class.for...
  • u012150370
  • u012150370
  • 2016年06月06日 17:26
  • 1545

JAVA 利用反射机制查询数据库返回相应对象

public static void main(String [] rags){ SQLHepler SH=new SQLHepler(); String sql="select * fro...
  • whzhaochao
  • whzhaochao
  • 2014年03月04日 20:49
  • 1681

java面试题--java反射机制

Java反射机制的作用: 1)在运行时判断任意一个对象所属的类。 2)在运行时判断任意一个类所具有的成员变量和方法。 3)在运行时任意调用一个对象的方法 4)在运行时构造任意一个类的对象 ...
  • snn1410
  • snn1410
  • 2015年04月10日 15:04
  • 13145

Java基础之—反射(非常重要)

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道...
  • sinat_38259539
  • sinat_38259539
  • 2017年05月13日 13:29
  • 3906

什么是反射?什么Java反射?

什么是反射(Reflection )?Java反射?
  • BuddyUU
  • BuddyUU
  • 2016年09月07日 11:57
  • 6742

一个例子让你了解Java反射机制

本文来自:blog.csdn.net/ljphhj JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我...
  • u011133213
  • u011133213
  • 2013年10月18日 21:53
  • 54999

Java反射用法详解

在过去的几次面试中,都被问到了反射这块的知识,并没有系统了解过Java的反射机制(现实是几乎怎么接触过),所以这方面的问题基本都回答不上来T_T 镇定思痛,我们来一起好好看看Java中反射的用法。...
  • hb_peng
  • hb_peng
  • 2016年08月26日 21:27
  • 2656

使用JAVA反射的利与弊

在Java的20周年的纪念日的日子里,让我们来重新温习下Java里面的高级知识,Java肯定希望大家了解她,要不然你跟她天天相濡以沫了这么长时间,让她知道你竟然不了解她,不在乎她,那么她该有多伤心呢,...
  • u010454030
  • u010454030
  • 2015年04月16日 16:11
  • 1103

java反射和内省

java中一个强大的功能,莫过于反射了。通常我们看看的Struct2、Struct1、Spring、Hibernate等等集合无一不使用了反射机制。那么什么是反射呢,到底有什么用呢? 一、反射机...
  • wodeyuer125
  • wodeyuer125
  • 2014年10月21日 21:46
  • 1267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java反射之查找一个类
举报原因:
原因补充:

(最多只允许输入30个字)