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】【反射技术】2个对象除了类名不一样,类的定义部分完全一样;当给定一个对象,转换成另一个类的对象。

1. API实现代码 toAnotherObj() 方法实现 package devin.wu.training.reflect.convertor; import java.lang.refl...

Java 编程下通过反射获取一个类中的方法名和对应参数名

实际编程中如果我们要使用系统中未暴露的方法,我们可以通过反射来使用这些方法,但在使用过程中我们很难确定方法对用的参数类型,以下的代码可以帮你得到这些信息: package cn.sunz...

Java学习笔记_反射_Class.forName()加载并修改一个类的私有成员变量

我相信实例比文字更能说明问题Demo1,被加载的类package com.text.hl;public class Demo1 { private int hl; }在这里我用junit...
  • HLhakey
  • HLhakey
  • 2015年08月31日 00:50
  • 1416

java中利用反射机制得到一个类的所有构造方法,成员方法机器参数的列表

我们在只知道类名的情况下,

庖丁解牛——Java反射解析一个类

一、什么是反射     反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序。能够分析类能力的程序称为反射(reflective...

Java反射-使用反射修改一个类中的所有String类型的成员变量的值

这个是我在学习java反射技术时的一个小Demo,理解了它你说你不会java反射,人家都不相信。下面的这个类是基类,我们要做的事情修改基类中所有的String类型的成员变量的值,将’b’修改为’a’:...

JAVA编码转换一个类 源代码

  • 2010年07月26日 15:34
  • 4KB
  • 下载

java,输入一个类或几个类,找到所有import的相关的类,相关的类又import

import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOExce...

知其然(3)*.java文件中可以包含多个类,但最多只能有一个类,其修饰符为public

1.*.java文件中可以包含多个类,但最多只能有一个类的public
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java反射之查找一个类
举报原因:
原因补充:

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