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
版权声明:本文为博主原创文章,转载请注明出处,欢迎大家来一起交流。 https://blog.csdn.net/feigeswjtu/article/details/78746211

Java反射获取一个类的所有get方法

package com.jund.test; public class TestVO { private String name; private String age; private St...
  • jund05
  • jund05
  • 2015-10-21 17:41:21
  • 776

java利用反射来调用一个类的私有方法

一。类如下。 public class Calculator2{ private int add(int a,int b){ return a+b; } ...
  • love_Ubuntu
  • love_Ubuntu
  • 2011-08-09 21:40:53
  • 3560

Java中通过反射调用其他类中的main方法时要注意的问题

一、正常情况下我们调用其他类的方法,如果是静态的,就直接:类名.方法 ;如果不是静态的:对象.方法;因为main为静态方法,所以调用它只需:类名.main(String...args)即可。   ...
  • duancanmeng
  • duancanmeng
  • 2012-04-14 10:21:04
  • 4915

java反射以及复制一个bean的值到另一个bean中。

  • 2018年01月23日 17:59
  • 2KB
  • 下载

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

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

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

测试类 import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflec...
  • woshixuye
  • woshixuye
  • 2014-03-27 19:33:49
  • 3216

java反射得到类对象,并且得到类的属性

问题引入?比如在一个jsp表单页面有几百个填报选项,提交传入后台,肯定后台不是一个一个的request.getParameter()的方法,我们可以采用以类的形式提交,关于这个实现在另外一篇文章有介绍...
  • pangliang_csdn
  • pangliang_csdn
  • 2016-09-09 13:59:37
  • 1456

如何利用反射机制另一个类中的private属性 | Java基础

反射机制的功能极其强大,反射机制可以用来: 1. 在运行中分析类的能力 2. 在运行中查看对象,例如,编写一个toString方法供所有类使用 3. 实现通用的数组操作代码 4. 利用Meth...
  • happyaaaaaaaaaaa
  • happyaaaaaaaaaaa
  • 2016-03-31 14:52:18
  • 554

java 反射 , 判断Class是否是某个类的子类或父类 .

Class c = ArrayList.class; c.isPrimitive(); //判断c是否为基本数据类型 c.isAssignableFrom(List.class);  //判断c是...
  • luqin1988
  • luqin1988
  • 2012-09-19 13:42:02
  • 4325

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

利用反射获得类的所有方法: Class classType = Class.forName("java.lang.String"); Method[] methods = classType.ge...
  • lgx06
  • lgx06
  • 2013-01-28 14:50:57
  • 1902
收藏助手
不良信息举报
您举报文章:Java反射之查找一个类
举报原因:
原因补充:

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