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
版权声明:本文为博主原创文章,转载请注明出处,欢迎大家来一起交流。

通过反射输入一个类,打印出类中所有元素

代码如下: import java.util.*; import java.lang.reflect.*; /** 反射---输入一个类,打印出类中所有元素 reflect包中有三个描述类元素的类:...
  • hj7jay
  • hj7jay
  • 2017年05月26日 09:17
  • 334

java反射:根据给定类名实例化类并调用其方法

根据文件流读来的类名实例化类并调用方法
  • u012546526
  • u012546526
  • 2015年03月13日 11:27
  • 1859

通过反射获取类中的属性,并且将类中的属性名称以及对应的值赋给另一个类中的对象

通过反射获取类中的属性,并且将类中的属性名称以及对应的值赋给另一个类中的对象 一、创建一个需要被反射的类 public class Test { private String name...
  • LK10207160511
  • LK10207160511
  • 2015年12月20日 14:54
  • 1885

JAVA 反射练习 打印指定类名的所有信息

给定类名,打印关于类的所有信息import java.lang.reflect.*; import javax.activation.FileDataSource; public class Re...
  • yzr1183739890
  • yzr1183739890
  • 2015年08月28日 19:26
  • 1100

笔试题12:如何利用反射实例化一个类(源码)

在Java学习中,反射还是相对比较难理解的一部分内容。如题,我们利用反射机制来实例化一个类,一般有两种方法。 1、如果使用无参数的构造方法,则直接使用Class类的newInstance()方法即可...
  • huangmp
  • huangmp
  • 2012年05月10日 15:53
  • 2580

使用反射获取一个类的所有方法和字段

利用反射获得类的所有方法: Class classType = Class.forName("java.lang.String"); Method[] methods = classType.ge...
  • lgx06
  • lgx06
  • 2013年01月28日 14:50
  • 1816

java反射调用set和get方法的通用类

我们有一个类的字段非常多,当我们要给遍历它的值或者shuo
  • q383965374
  • q383965374
  • 2014年06月30日 18:20
  • 15876

Java中利用反射原理拷贝对象

测试类 import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflec...
  • woshixuye
  • woshixuye
  • 2014年03月27日 19:33
  • 3177

java反射(获取某个类或者某个对象所对应的Class对象的常用3中方法)

1.使用Class类的静态方法 forName:   Class.forName("java.lang.Object"); public class TestClassForName { pub...
  • xinhuaxuan
  • xinhuaxuan
  • 2013年01月19日 11:54
  • 14814

如何利用反射判断一个成员是否为某一类型

ObjectExchange obj = new ObjectExchange(); Type type = obj.GetType(); Fiel...
  • shixueli
  • shixueli
  • 2012年04月20日 07:19
  • 1177
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java反射之查找一个类
举报原因:
原因补充:

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