创建运行时类的对象
获取运行时类的完整结构
通过反射获取运行时类的完整结构
可以获取的:Filed 、 Method 、 Constructor 、 Superclass 、 Interface 、 Annotation
- 实现的全部接口
- 所继承的父亲
- 全部的构造器
- 全部的方法
- 全部的Filed
- 注解
- …
package com.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//获得类的信息
public class Test08 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1 = Class.forName("com.reflection.User");
/* User user = new User();
c1 = user.getClass();*/
//获得类的名字
System.out.println(c1.getName());//获得包名加类名 com.reflection.User
System.out.println(c1.getSimpleName());//获得类名 User
System.out.println("==============================");
//获得类的属性
Field[] fields = c1.getFields();//只能找到 public 属性
/*for (Field field : fields) {
System.out.println(field);
}*/
fields = c1.getDeclaredFields();//可以找到全部的属性
for (Field field : fields) {
System.out.println(field);
}
/*
private java.lang.String com.reflection.User.name
private int com.reflection.User.id
private int com.reflection.User.age */
System.out.println("==============================");
//获得指定属性的值
Field name = c1.getDeclaredField("name");
System.out.println(name);//private java.lang.String com.reflection.User.name
System.out.println("==============================");
//获得类的方法
Method[] methods = c1.getMethods();//获得本类及其父类的所有public方法
for (Method method : methods) {
System.out.println("正常的:"+method);
}
/*
正常的:public java.lang.String com.reflection.User.getName()
正常的:public int com.reflection.User.getId()
正常的:public void com.reflection.User.setName(java.lang.String)
正常的:public int com.reflection.User.getAge()
正常的:public void com.reflection.User.setId(int)
正常的:public void com.reflection.User.setAge(int)
正常的:public final void java.lang.Object.wait() throws java.lang.InterruptedException
正常的:public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
正常的:public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
正常的:public boolean java.lang.Object.equals(java.lang.Object)
正常的:public java.lang.String java.lang.Object.toString()
正常的:public native int java.lang.Object.hashCode()
正常的:public final native java.lang.Class java.lang.Object.getClass()
正常的:public final native void java.lang.Object.notify()
正常的:public final native void java.lang.Object.notifyAll()
*/
methods = c1.getDeclaredMethods();//获得本类的全部方法
for (Method method : methods) {
System.out.println("getDeclaredMethods:"+methods);
}
/*
getDeclaredMethods:[Ljava.lang.reflect.Method;@74a14482
getDeclaredMethods:[Ljava.lang.reflect.Method;@74a14482
getDeclaredMethods:[Ljava.lang.reflect.Method;@74a14482
getDeclaredMethods:[Ljava.lang.reflect.Method;@74a14482
getDeclaredMethods:[Ljava.lang.reflect.Method;@74a14482
getDeclaredMethods:[Ljava.lang.reflect.Method;@74a14482
*/
System.out.println("==============================");
//获得指定的方法 因为方法有重载,因此获得指定方法时,需要添加参数(参数可以是:参数类型)
Method getName = c1.getMethod("getName",null);
Method setName = c1.getMethod("setName", String.class);
System.out.println(getName);
System.out.println(setName);
System.out.println("==============================");
//获得构造器
Constructor[] constructors = c1.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
constructors = c1.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println("getDeclaredConstructors:"+constructor);
}
System.out.println("==============================");
//获得指定的构造器
Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
System.out.println("指定的构造器:"+declaredConstructor);
}
}