图1:
实现目标:test07获取test01的完整结构
test01 源代码:
package wanwan.pachage;
//什么叫反射
public class test01 extends Object{
public static void main(String[] args) throws ClassNotFoundException {
//通过反射获取类的class对象
Class c1 = Class.forName("wanwan.pachage.test01.user");
Class c2 = Class.forName("wanwan.pachage.test01.user");
Class c3 = Class.forName("wanwan.pachage.test01.user");
Class c4 = Class.forName("wanwan.pachage.test01.user");
System.out.println(c1);
//一个类在内存中只有一个class对象
//一个类被加载后,类的整个结构都会封装在class对象中
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
}
}
//实体类:pojo,entity
class user{
private String name;
private int age;
private int id;
public user() {
}
public user(String name, int age, int id) {
this.name = name;
this.age = age;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "user{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}
test07 源代码:
package wanwan.pachage;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class test07 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1 = Class.forName("wanwan.pachage.user");
user u = new user();
c1 = u.getClass();
//获得类的名字
System.out.println(c1.getName());//获得包名+类名
System.out.println(c1.getSimpleName());//获得类名
System.out.println("=======================");
//获得类的属性
Field[] fields = c1.getFields();//只能找到public属性
/*for (Field field : fields) {
System.out.println(field);
}-----未能输出,why?--->属性私有
*/
fields = c1.getDeclaredFields();//找到全部的属性
for (Field field : fields) {
System.out.println(field);
}
//获得指定属性的值
/*
Field name = c1.getField("name");//会报错,思考为什么?-->只能找到public属性
System.out.println(name);
*/
Field name = c1.getDeclaredField("name");
System.out.println(name);
//l获得类的方法
System.out.println("============================");
Method[] methods = c1.getMethods();//获得本类及父类的全部public方法
for (Method method : methods) {
System.out.println("正常的:"+method);
}
System.out.println("============================");
Method[] declaredMethods = c1.getDeclaredMethods();//获得本类的所有方法
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
System.out.println("==================================");
//获得指定方法
//重载
Method getName = c1.getMethod("getName", null);
Method setName = c1.getDeclaredMethod("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("###"+constructor);
}
//获得指定的构造器
Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
System.out.println("指定:"+declaredConstructor);
}
}
test07运行结果:
"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" "-javaagent:G:\IDEA\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=50156:G:\IDEA\IntelliJ IDEA 2019.3.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;E:\我的程序人生\java\Reflection\out\production\Reflection" wanwan.pachage.test07
wanwan.pachage.user
user
=======================
private java.lang.String wanwan.pachage.user.name
private int wanwan.pachage.user.age
private int wanwan.pachage.user.id
private java.lang.String wanwan.pachage.user.name
============================
正常的:public java.lang.String wanwan.pachage.user.toString()
正常的:public java.lang.String wanwan.pachage.user.getName()
正常的:public int wanwan.pachage.user.getId()
正常的:public void wanwan.pachage.user.setName(java.lang.String)
正常的:public int wanwan.pachage.user.getAge()
正常的:public void wanwan.pachage.user.setAge(int)
正常的:public void wanwan.pachage.user.setId(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 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()
============================
public java.lang.String wanwan.pachage.user.toString()
public java.lang.String wanwan.pachage.user.getName()
public int wanwan.pachage.user.getId()
public void wanwan.pachage.user.setName(java.lang.String)
public int wanwan.pachage.user.getAge()
public void wanwan.pachage.user.setAge(int)
public void wanwan.pachage.user.setId(int)
==================================
public java.lang.String wanwan.pachage.user.getName()
public void wanwan.pachage.user.setName(java.lang.String)
=========================
public wanwan.pachage.user()
public wanwan.pachage.user(java.lang.String,int,int)
###public wanwan.pachage.user()
###public wanwan.pachage.user(java.lang.String,int,int)
指定:public wanwan.pachage.user(java.lang.String,int,int)
Process finished with exit code 0