JAVA反射
Class类
在面向对象的世界里,万事万物皆对象
类是对象,类是java.lang.Class类的实例对象,每一个对象所属的类就是java.lang.Class类的实例。
下面一个事例:
public class ClassDemo1 {
public static void main(String[] args) {
//Foo的实例对象如何表示
Foo foo1=new Foo();
//Foo类也是一个实例,Class类的实例对象如何表示
//任何类都是Class的实例对象,这个实例对象有三种表示方式
//第一种表示方式--->任何一个类都有一个隐含的静态成员变量class
Class c1=Foo.class;
// 第二种表达方式,已经知道该类的对象通过getClass方法
Class c2=foo1.getClass();
/**
* 官网c1,c2表示Foo类的类类型(class type)
* 万事万物皆对象
* 类也是对象,是Class类的实例对象
* 这个对象我们称为该类的类类型
*/
//不管c1 or c2都代表了Foo类的类类型,一个类只可能是Class类的一个势力实例对象
System.out.println(c1==c2);
//第三种表达方式
Class c3=null;
try {
c3=Class.forName("com.imooc.reflect.Foo");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(c2==c3);
//我们可以通过类的类类型创建该类的对象实例--->通过c1,c2,c3创建Foo的实例对象
try {
Foo foo=(Foo)c1.newInstance();//需要有无参数的构造方法
foo.print();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Foo{
void print(){
System.out.println("foo");
}
}
打印结果:
true
true
foo
Class.forName(“类的全称”)
不仅表示了类的类类型,还表示了动态加载类
要区分编译和运行
编译时刻加载类是静态加载类,运行时刻加载类是动态加载类
New创建对象是静态加载类,在类的编译时刻就需要加载所有可能使用到的类,通过动态加载类可以解决该问题(Class.forName(“类的全称”))
获取方法信息
public class ClassDemo2 {
public static void main(String[] args) {
Class c1=int.class;//int的类类型
Class c2=String.class;//String的类类型
Class c3=double.class;
Class c4=Double.class;
Class c5=void.class;
System.out.println(c1.getName());
System.out.println(c2.getName());
System.out.println(c2.getSimpleName());//不包含包名的类名称
System.out.println(c3.getName());
System.out.println(c4.getName());
System.out.println(c5.getName());
}
}
打印结果:
int
java.lang.String
String
double
java.lang.Double
void
基本数据类型
void关机键字都存在类类型
Class类的基本API操作
查看类的成员函数
public class ClassUtil {
/**
* 打印类的信息,包括类的成员函数,成员变量
* @param obj该对象所属类的信息
*/
public static void printClassMessage(Object obj) {
//获取累的信息,首先获取类的类类型
Class c=obj.getClass();//传递的是哪个子类的对象,C就是该子类的类类型
//获取类的名称
System.out.println("类的名称:"+c.getName());
/**
* Method类,方法对象,一个成员方法就是一个Method对象
* getMethods()方法获取的是所有的public的函数,包括父类继承而来的
* getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
*/
Method[] ms=c.getMethods();//c.getDeclaredMethods()
for (int i=0;i<ms.length;i++) {
//得到方法的返回值类型的类类型,如果方法返回时String或者int类型,那么得到的就是String.class或int.class
Class returnType=ms[i].getReturnType();
System.out.print(returnType.getName()+" ");
//得到方法名称
System.out.print(ms[i].getName()+"(");
//获取参数类型--->得到的是参数列表的类型的类类型
Class[] paramTypes=ms[i].getParameterTypes();
for (int j=0;j<paramTypes.length;j++) {
System.out.print(paramTypes[j].getName()+",");
}
System.out.println(")");
}
}
public static void main(String[] args) {
String s="hello";
ClassUtil.printClassMessage(s);
}
}
打印结果:
类的名称:java.lang.String
boolean equals(java.lang.Object,)
java.lang.String toString()
int hashCode()
int compareTo(java.lang.String,)
int compareTo(java.lang.Object,)
int indexOf(java.lang.String,int,)
int indexOf(java.lang.String,)
int indexOf(int,int,)
int indexOf(int,)
java.lang.String valueOf(int,)
java.lang.String valueOf(long,)
java.lang.String valueOf(float,)
java.lang.String valueOf(boolean,)
java.lang.String valueOf([C,)
java.lang.String valueOf([C,int,int,)
java.lang.String valueOf(java.lang.Object,)
java.lang.String valueOf(char,)
java.lang.String valueOf(double,)
char charAt(int,)
int codePointAt(int,)
int codePointBefore(int,)
int codePointCount(int,int,)
int compareToIgnoreCase(java.lang.String,)
java.lang.String concat(java.lang.String,)
boolean contains(java.lang.CharSequence,)
boolean contentEquals(java.lang.CharSequence,)
boolean contentEquals(java.lang.StringBuffer,)
java.lang.String copyValueOf([C,)
java.lang.String copyValueOf([C,int,int,)
boolean endsWith(java.lang.String,)
boolean equalsIgnoreCase(java.lang.String,)
java.lang.String format(java.util.Locale,java.lang.String,[Ljava.lang.Object;,)
java.lang.String format(java.lang.String,[Ljava.lang.Object;,)
void getBytes(int,int,[B,int,)
[B getBytes(java.nio.charset.Charset,)
[B getBytes(java.lang.String,)
[B getBytes()
void getChars(int,int,[C,int,)
java.lang.String intern()
boolean isEmpty()
java.lang.String join(java.lang.CharSequence,[Ljava.lang.CharSequence;,)
java.lang.String join(java.lang.CharSequence,java.lang.Iterable,)
int lastIndexOf(int,)
int lastIndexOf(java.lang.String,)
int lastIndexOf(java.lang.String,int,)
int lastIndexOf(int,int,)
int length()
boolean matches(java.lang.String,)
int offsetByCodePoints(int,int,)
boolean regionMatches(int,java.lang.String,int,int,)
boolean regionMatches(boolean,int,java.lang.String,int,int,)
java.lang.String replace(char,char,)
java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence,)
java.lang.String replaceAll(java.lang.String,java.lang.String,)
java.lang.String replaceFirst(java.lang.String,java.lang.String,)
[Ljava.lang.String; split(java.lang.String,)
[Ljava.lang.String; split(java.lang.String,int,)
boolean startsWith(java.lang.String,int,)
boolean startsWith(java.lang.String,)
java.lang.CharSequence subSequence(int,int,)
java.lang.String substring(int,)
java.lang.String substring(int,int,)
[C toCharArray()
java.lang.String toLowerCase(java.util.Locale,)
java.lang.String toLowerCase()
java.lang.String toUpperCase()
java.lang.String toUpperCase(java.util.Locale,)
java.lang.String trim()
void wait()
void wait(long,int,)
void wait(long,)
java.lang.Class getClass()
void notify()
void notifyAll()
java.util.stream.IntStream chars()
java.util.stream.IntStream codePoints()
查看类的成员变量
public class ClassUtil {
/**
* 打印类的信息,包括类的成员变量
* @param obj该对象所属类的信息
*/
public static void printFieldMessage(Object obj) {
Class c=obj.getClass();
/**
* 成员变量也是对象,java.lang.reflect.Field类封装了关于成员变量的操作
* getFields()方法获取的是所有的public的成员变量的信息
* getDeclaredFields()获得自己所有声明的成员变量的信息
*/
//Field[] fs=c.getFields();
Field[] fs=c.getDeclaredFields();
for(int k=0;k<fs.length;k++){
//得到成员变量的类类型
Class fieldType=fs[k].getType();
String typeName=fieldType.getName();
//得到成员变量的名称
String fieldName=fs[k].getName();
System.out.println(typeName+" "+fieldName);
}
}
public static void main(String[] args) {
String s="hello";
ClassUtil.printFieldMessage(s);
}
}
打印结果:
[C value
int hash
long serialVersionUID
[Ljava.io.ObjectStreamField; serialPersistentFields
java.util.Comparator CASE_INSENSITIVE_ORDER
查看类的构造函数
public class ClassUtil {
/**
* 打印类的信息,包括类的构造函数
* @param obj该对象所属类的信息
*/
public static void printConstructorMessage(Object obj) {
/*
*打印构造函数信息,构造函数也是对象
* java.lang.Constructor中封装了构造函数的信息
* getConstructors()获取所有的public的构造函数
* .getDeclaredConstructors()得到所有的public的构造方法
*/
Class c=obj.getClass();
//Constructor[] cs=c.getConstructors();
Constructor[] cs=c.getDeclaredConstructors();
for(int i=0;i<cs.length;i++){
System.out.print(cs[i].getName()+"(");
//获取构造函数的参数列表
Class[] paramTypes=cs[i].getParameterTypes();
for(int j=0;j<paramTypes.length;j++){
System.out.print(paramTypes[j].getName()+",");
}
System.out.println(")");
}
}
public static void main(String[] args) {
String s="hello";
ClassUtil.printConstructorMessage(s);
}
}
}
打印结果:
java.lang.String([B,int,int,)
java.lang.String([B,java.nio.charset.Charset,)
java.lang.String([B,java.lang.String,)
java.lang.String([B,int,int,java.nio.charset.Charset,)
java.lang.String([B,int,int,java.lang.String,)
java.lang.String([C,boolean,)
java.lang.String(java.lang.StringBuilder,)
java.lang.String(java.lang.StringBuffer,)
java.lang.String([B,)
java.lang.String([I,int,int,)
java.lang.String()
java.lang.String([C,)
java.lang.String(java.lang.String,)
java.lang.String([C,int,int,)
java.lang.String([B,int,)
java.lang.String([B,int,int,int,)