Java反射(一) : 获取Class对象

所有反射操作的入口都是java.lang.Class。除了java.lang.reflect.ReflectPermission之外,没有哪个在java.lang.reflect包下面的类有共有构造器。为了获得这些类,有必要去调用Class的适当方法。对象,类名,类型或者已存在的Class,这些是得到Class的几种方法。

Object.getClass()

如果可获得一个对象的实例,最简单的获取Class的方法是调用Object.getClass()。当然,这必须是继承自Object的引用类型才可以(原始类型不行)。

Class c = "foo".getClass();

.class语法

如果一种类型已知,但没有可用的实例,可以使用.class语法获取Class。这也是获取原始类型Class的最简单方法。

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

Class c = boolean.class;  // correct

再比如,

Class c = java.io.PrintStream.class;

Class.forName()

如果一个类的权限定名已知,就可以使用这个静态方法获取Class。

但Class.forName()不能用来用于原始类型,(这好理解,比较根本就没有类名)。对于数据类型的名字,在Class.getName有描述。

注:
String.class.getName()
     returns "java.lang.String"
 byte.class.getName()
     returns "byte"
 (new Object[3]).getClass().getName()
     returns "[Ljava.lang.Object;"
 (new int[3][4][5][6][7][8][9]).getClass().getName()
     returns "[[[[[[[I"

其中对于数组而言,会以一个或多个"["开头,作为数组嵌套的深度。数组的类型会编码如下:

Element Type   Encoding
boolean   Z
byte   B
char   C
class or interface   Lclassname;
double   D
float   F
int   I
long   J
short   S
因此,
Class cDoubleArray = Class.forName("[D");

表示一个double[]的Class。


原始类型的包装类型的TYPE属性

<span style="font-size:18px;">Class c = Double.TYPE;</span>

再比如,

<span style="font-size:18px;">Class c = Void.TYPE;</span>

Void.TYPE是void.class的标识。

能返回Class的方法

1, 返回父类的Class, Class.getSuperclass()

如,

Class c = javax.swing.JButton.class.getSuperclass();

JButton的父类是AbstactButton。Class.getClasses()

2, 返回该类属性的所有共有的类、接口、枚举,包括继承的成员。

Class<?>[] c = Character.class.getClasses();

3,返回所有声明的类、接口、枚举(不管公有、私有).Class.getDeclaredClasses()

Class<?>[] c = Character.class.getDeclaredClasses();

下面三个方法类似,

java.lang.reflect.Field.getDeclaringClass()
java.lang.reflect.Method.getDeclaringClass()
java.lang.reflect.Constructor.getDeclaringClass()

分别是获取字段、方法、构造器所在的Class.

import java.lang.reflect.Field;

Field f = System.class.getField("out");
Class c = f.getDeclaringClass();

字段out是在System声明。

另外,匿名类没有一个“声明”类,但有“被包含”类。

Class c = Thread.State.class().getEnclosingClass();

枚举Thread.State包含在Thread。

时间: 2024-10-11 12:19:30

Java反射(一) : 获取Class对象的相关文章

java反射之获取枚举对象

项目中导入大量枚举对象,用来定义常量.随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求. 1 public enum ExamType { 2 CRAFT(1, "草稿"), 3 PASSING(2, "待审核"); 4 private int value; 5 private String typeName; 6 7 ExamType(int value, String typeName) { 8 this.value = value; 9 t

Java反射机制(创建Class对象的三种方式)

1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Modifier 2:什么是反射 JAVA反射机制是在运行状态中,对于任意一个类.都能都知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称

javassist:增强型的java反射工具,获取方法参数名

java的反射是不能获取方法的参数名的.比如: [java] view plaincopyprint? public String concatString(String str1,String str2){ return str1+str2; }     public String concatString(String str1,String str2){         return str1+str2;     } 想获取"str1",和"str1"这个参数

反射技术获取到对象中的指定方法

使用反射技术根据路径获取到对象对象.Class获取到class对象使用class对象通过getDeclaredFields()方法获取到目标类中的属性值集合Field[]使用class对象通过getDeclaredMethods方法获取到目标类中的方法集合public void Test(){User user = new User();Class clazz = user.getClass();Fiedld[] fields = clazz.getDeclaredFields();for(Fi

java webservice服务器端获取request对象的三种方式

有的时候在webservice里我们需要获取request对象和response对象,比如想要获得客户端的访问ip的时候就需要这么做,下面说三种方式,当然三种方式可能是针对不同方式部署webservice获取request对象的方法. 第一种:先配置注入: @Resource private WebServiceContext webServiceContext; 其次是下面的代码: MessageContext mc = webServiceContext.getMessageContext(

java 反射机制-获取对应class信息

1 package reflection; 2 3 public class User { 4 public String name; 5 protected int age; 6 String address; 7 private String sex; 8 9 public User() { 10 super(); 11 } 12 13 public User(String name, int age, String sex) { 14 super(); 15 this.name = nam

Java单例获取本对象的引用

在项目中想要获取到CommandLineRunner的实现类的引用,如果直接new对象又会导致其中的变量改变, 这时就需要直接获取本对象的引用,来调用其中的方法 通过this获取本对象的引用 原文地址:https://www.cnblogs.com/xujuntao/p/11044344.html

通过java反射机制获取该类的所有属性类型、值。

转自:http://blog.sina.com.cn/s/blog_3c62c21f01011xci.html 方法使用了这俩个包下的 field 和method import java.lang.reflect.Field; import java.lang.reflect.Method; public static void getObjectValue(Object object) throws Exception {   //我们项目的所有实体类都继承BaseDomain (所有实体基类

java 反射机制获取类名、属性、方法、构造器和反射动态使用

被反射的类: @Table("tb_student") public class Student { @Fields(columnName="id",type="int",length=10) private int id; @Fields(columnName="studentName",type="varchar",length=10) private String studentName; @Fiel

反射机制获取Class对象的三种方式:

Person person = new Person(); //1.通过Object类的getClass()方法:(需要先实例化一个对象) Class clazz1 = person.getClass(); //2.通过对象实例方法获取对象:(需要先实例化一个对象) Class clazz2 = person.class; //3.类的全路径:(不许呀实例对象) Class clazz3 = Class.forName("com.cn.Person"); 对于有空的构造函数的类可以直接