链接: Class对象功能图文版
链接: 反射案例实现
Class对象功能代码实现
获取功能:
-
获取成员变量
-
Field[] getFields()【获取所有public类型成员变量】
-
Field getField(String name)
-
Field[] getDeclaredFields()
-
Field getDeclaredField(String name)
-
-
获取构造方法
-
Constructor getConstructor(类<?>… parameterTypes)
-
Constructor<?>[] getConstructors()
-
Constructor getDeclaredConstructor(类<?>… parameterTypes)
-
Constructor<?>[] getDeclaredConstructors()
-
-
获取成员方法
-
方法 getDeclaredMethod(String name, 类<?>… parameterTypes)
-
方法[] getDeclaredMethods()
-
方法 getEnclosingMethod()
-
方法 getMethod(String name, 类<?>… parameterTypes)
-
方法[] getMethods()
-
-
获取类名
- String getName()
获取成员变量
设置值:set(Object obj,Object value)【将指定对象参数上的此Field对象表示的字段设置为指定的新值】
获取值:get(Object obj)【返回该所表示的字段的值Field,指定的对象上】
package com.yuhang.reflect;
import com.yuhang.domain.Person;
import java.lang.reflect.Field;
public class ReflectDemo2 {
/**
*### 获取功能:
*
* 1. 获取成员变量
* - Field[] getFields()
* - Field getField(String name)
* - Field[] getDeclaredFields()
* - Field getDeclaredField(String name)
*/
public static void main(String[] args) throws Exception {
//1.获取Person的Class对象
Class personClass = Person.class;
//Field[] getFields()
Field[] fields = personClass.getFields();//加载public类型成员变量
for (Field field : fields) {
System.out.println(field);//public java.lang.String com.yuhang.domain.Person.a
System.out.println(field.getName());//a
}
System.out.println("---------------");
//Field getField(String name)
Field a = personClass.getField("a");//加载public类型成员变量
System.out.println(a);//public java.lang.String com.yuhang.domain.Person.a
//获取方法1
Person person = new Person();
Object o = a.get(person);
System.out.println(o);//null
a.set(person,"hah");
Object o1 = a.get(person);
System.out.println(o1);//hah
//方法2
Person person1 = new Person();
Object o2 = a.get(person1);
System.out.println(o2);//null
a.set(person1,"2");
System.out.println(person1);//Person{name='null', age='null', a='2', b='null', c='null', d='null'}
System.out.println("---------------");
//Field[] getDeclaredFields()
Field[] declaredFields = personClass.getDeclaredFields();//加载所有成员变量
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
System.out.println(declaredField.getName());
}
System.out.println("---------------");
// Field getDeclaredField(String name)
Field d = personClass.getDeclaredField("d");
System.out.println(d);//private java.lang.String com.yuhang.domain.Person.d
// Object o3 = d.get(person);
// System.out.println(o3);//不能访问私有
//忽略修饰符安全监测
d.setAccessible(true);//暴力反射
Object o3 = d.get(person);
System.out.println(o3);//null
}
}
[Person]
package com.yuhang.domain;
public class Person {
private String name;
private String age;
public String a;
protected String b;
String c;
private String d;
public Person() {
}
public Person(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
}
获取构造方法
newInstance(Object… initargs)【 使用此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。】
package com.yuhang.reflect;
import com.yuhang.domain.Person;
import java.lang.reflect.Constructor;
public class ReflectDemo3 {
/**
*### 获取功能:
* 2. 获取构造方法
* - Constructor<T> getConstructor(类<?>... parameterTypes)
* - Constructor<?>[] getConstructors()
* - Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
* - Constructor<?>[] getDeclaredConstructors()
*/
public static void main(String[] args) throws Exception {
//1.获取Class对象
Class personClass = Person.class;
//Constructor<T> getConstructor(类<?>... parameterTypes)
Constructor constructor = personClass.getConstructor();
System.out.println(constructor);//public com.yuhang.domain.Person()
System.out.println(constructor.getName());//com.yuhang.domain.Person
Constructor constructor1 = personClass.getConstructor(String.class,String.class);
System.out.println(constructor1);//public com.yuhang.domain.Person(java.lang.String,java.lang.String)
System.out.println(constructor1.getName());//com.yuhang.domain.Person
Object zhangsan = constructor1.newInstance("zhangsan", "1");//使用此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
System.out.println(zhangsan);//Person{name='zhangsan', age='1', a='null', b='null', c='null', d='null'}
//私有报错
// Constructor constructor2 = personClass.getConstructor(int.class);
// System.out.println(constructor2);
// System.out.println(constructor2.getName());
System.out.println("--------------");
//Constructor<?>[] getConstructors()
Constructor[] constructors = personClass.getConstructors();
for (Constructor constructors1 : constructors) {
System.out.println(constructors1);
//public com.yuhang.domain.Person()
//public com.yuhang.domain.Person(java.lang.String,java.lang.String)
System.out.println(constructors1.getName());
//com.yuhang.domain.Person
//com.yuhang.domain.Person
}
System.out.println("--------------");
//Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
Constructor declaredConstructor = personClass.getDeclaredConstructor();
System.out.println(declaredConstructor);//public com.yuhang.domain.Person()
System.out.println(declaredConstructor.getName());//com.yuhang.domain.Person
Constructor constructor2 = personClass.getDeclaredConstructor(String.class);
// constructor2.setAccessible(true);
System.out.println(constructor2);
System.out.println(constructor2.getName());
constructor2.setAccessible(true);//暴力反射
Object hahh = constructor2.newInstance("hahh");//给值 私有hahh
// System.out.println(hahh);
System.out.println("--------------");
//Constructor<?>[] getDeclaredConstructors()
Constructor[] declaredConstructors = personClass.getDeclaredConstructors();
for (Constructor declaredConstructors1 : declaredConstructors) {
System.out.println(declaredConstructors1);
//private com.yuhang.domain.Person(java.lang.String)
//public com.yuhang.domain.Person(java.lang.String,java.lang.String)
//public com.yuhang.domain.Person()
}
}
}
[Person]
package com.yuhang.domain;
public class Person {
private String name;
private String age;
public String a;
protected String b;
String c;
private String d;
private String e;
public Person() {
}
public Person(String name, String age) {
this.name = name;
this.age = age;
}
private Person(String e){
this.e = e;
System.out.println("私有"+e);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
", e='" + e + '\'' +
'}';
}
}
获取成员方法
invoke(Object obj, Object… args)【 在具有指定参数的 方法对象上调用此 方法
对象表示的底层方法。 】
package com.yuhang.reflect;
import com.yuhang.domain.Person;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectDemo4 {
/**
*### 获取功能:
* 3. 获取成员方法
* - 方法 getDeclaredMethod(String name, 类<?>... parameterTypes)
* - 方法[] getDeclaredMethods()
* - 方法 getEnclosingMethod()
* - 方法 getMethod(String name, 类<?>... parameterTypes)
* - 方法[] getMethods()
*/
public static void main(String[] args) throws Exception {
//1.获取Class对象
Class personClass = Person.class;
//方法[] getMethods()
Method method = personClass.getMethod("getName");
System.out.println(method);//public java.lang.String com.yuhang.domain.Person.getName()
System.out.println(method.getName());//getName
Method look = personClass.getMethod("look");
Person person = new Person();
look.invoke(person);//看
Method look1 = personClass.getMethod("look", int.class);
look1.invoke(person,134);//看134
//私有不可
// Method method1 = personClass.getMethod("getName1");
// System.out.println(method1);
// System.out.println(method1.getName());
System.out.println("----------------");
//方法 getMethod(String name, 类<?>... parameterTypes)
Method[] methods = personClass.getMethods();
for (Method method1 : methods) {
System.out.println(method1);
//public java.lang.String com.yuhang.domain.Person.toString()
//public java.lang.String com.yuhang.domain.Person.getName()
//public void com.yuhang.domain.Person.setName(java.lang.String)
//public void com.yuhang.domain.Person.setAge(java.lang.String)
//public java.lang.String com.yuhang.domain.Person.getAge()
//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成员方法,还有Object类的方法
}
System.out.println("----------------");
//方法[] getDeclaredMethods()
Method declaredMethod = personClass.getDeclaredMethod("getName1");
System.out.println(declaredMethod);//private void com.yuhang.domain.Person.getName1()
System.out.println(declaredMethod.getName());//getName1
Method eat = personClass.getDeclaredMethod("eat");
Person person1 = new Person();
eat.setAccessible(true);//暴力反射
eat.invoke(person1);//chi
System.out.println("----------------");
//方法 getDeclaredMethod(String name, 类<?>... parameterTypes)
Method[] declaredMethods = personClass.getDeclaredMethods();
for (Method declaredMethod1 : declaredMethods) {
System.out.println(declaredMethod1);
//public java.lang.String com.yuhang.domain.Person.toString()
//public java.lang.String com.yuhang.domain.Person.getName()
//public void com.yuhang.domain.Person.setName(java.lang.String)
//private void com.yuhang.domain.Person.getName1()
//public void com.yuhang.domain.Person.setAge(java.lang.String)
//public java.lang.String com.yuhang.domain.Person.getAge()
//自己的所有方法
}
}
}
[Person]
package com.yuhang.domain;
public class Person {
private String name;
private String age;
public String a;
protected String b;
String c;
private String d;
private String e;
public Person() {
}
public Person(String name, String age) {
this.name = name;
this.age = age;
}
private Person(String e){
this.e = e;
System.out.println("私有"+e);
}
public String getName() {
return name;
}
private void getName1(){}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
", e='" + e + '\'' +
'}';
}
public void look(){
System.out.println("看");
}
public void look(int a){
System.out.println("看"+a);
}
private void eat(){
System.out.println("chi");
}
}
获取类名
String name = personClass.getName();
System.out.println(name);//com.yuhang.domain.Person
2021年9月29日10:34:05