注:本博客为本人学习笔记,仅供参考
一,Class类的三种获取方式
1,Class.forName(“cn.doma.Person”);多用于配置文件加载
2,类名.class。多用于参数传递
3,对象.class
用例:
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
//1,Class.forName("cn.doma.Person");多用于配置文件加载
Class cls=Class.forName("cn.doma.Person");
System.out.println(cls);
//2,类名.class。多用于参数传递
Class cls2=Person.class;
System.out.println(cls2);
//3,对象.class
Person p=new Person();
Class cls3=p.getClass();
System.out.println(cls3);
//同一个.class字节码文件在一次执行中只会加载一次,不论何种加载方式都是同一个
System.out.println(cls2==cls);
System.out.println(cls2==cls3);
}
}
输出:
sequenceDiagram
class cn.doma.Person
class cn.doma.Person
class cn.doma.Person
true
true
二,获取Class中的属性,方法,构造
1,成员变量获取
- 1.获取成员变量们
- Field[]getFields():获取所有public修饰的成员变量
- Field getField(Strinc name)
- Field[]getDeclaredFields():获取所有的成员变量,不考虑修饰符
- Field getDeclaredField(String name)
public static void main(String[] args) throws Exception {
Person p=new Person();
Class personClass= Person.class;
Field[] fields=personClass.getFields();
for (Field field:fields){
System.out.println(field);
}
System.out.println("-----------------");
Field field=personClass.getField("pwd");
System.out.println(field);
System.out.println("-----------------");
p.setPwd(3);
Object value= field.get(p);
System.out.println(value);
System.out.println("-----------------");
Field field2=personClass.getField("name");
field2.set(p,"张三");
System.out.println(p);
System.out.println("==================");
Field[] fields1=personClass.getDeclaredFields();
for (Field field3:fields1){
System.out.println(field3);
}
System.out.println("-----------------");
Field age=personClass.getDeclaredField("age");
//忽略权限修饰符的检查
age.setAccessible(true);//暴力反射,强制操作私有变量
Object age2=age.get(p);
System.out.println(age2);
age.set(p,20);
System.out.println(p);
}
输出
public java.lang.String cn.doma.Person.name
public int cn.doma.Person.pwd
-----------------
public int cn.doma.Person.pwd
-----------------
3
-----------------
Person{name='张三', age=0, pwd=3}
==================
public java.lang.String cn.doma.Person.name
private int cn.doma.Person.age
public int cn.doma.Person.pwd
-----------------
0
Person{name='张三', age=20, pwd=3}
- 2,获取构造方法们
- Constructor<?>[]getConstructors()
- *Constructor getConstructor(类<?>… parameterTypes)
- Constructor一cetDeclaredConstructor(类<?>… parameterTypes)
- Constructor<?>[]getoeclaredConstructors()
用例:
public static void main(String[] args) throws Exception {
//Person p = new Person();
Class personClass = Person.class;
Constructor constructor =personClass.getConstructor(String.class,int.class);
Person person= (Person) constructor.newInstance("qiao",20);
System.out.println(constructor);
System.out.println(person.name);
//personClass.newInstance()无参数可以使用
}
输出:
public cn.doma.Person(java.lang.String,int)
qiao
-
3.获取成员方法们.
-
*Method[]getMethods()
-
,Method getMethod(String name,类<?>… parameterTypes)
-
Method[]getDeclaredMethods()
-
Method getDeclaredMethod(String name,类<?>… parameterTypes)
-
4.获取类名
-
,String getName()
用例:
public static void main(String[] args) throws Exception {
Person p = new Person();
Class personClass = Person.class;
Method method= personClass.getMethod("eat");
//method.setAccessible(true);暴力反射
method.invoke(p);
Method method2= personClass.getMethod("eatFood", String.class);
method2.invoke(p,"fish");
Method[] methods=personClass.getMethods();
for (Method method1:methods){
String name=method1.getName();
System.out.println(name);
}
System.out.println("============");
//获取类名
String classname=personClass.getName();
System.out.println(classname);
}