1,根据类对象通过反射获取类实例
getclass() 函数
img.png
获取Class类的实例
img_1.png
package com.yang;
class Test{
public static void main(String[] args) throws ClassNotFoundException {
//获得类的class对象
//方式1: 通过对象获得
Person person = new Student("yang");
System.out.println(person.name + " code : " + person.code);
Class c1 = person.getClass();
System.out.println("Class: "+ c1);
//方式二 forname 获取
Class c2 = Class.forName("com.yang.Student");
System.out.println("Class: "+ c2);
//方式三 通过类名.class获取
Class c3 = Student.class;
System.out.println("class: "+ c3);
//方式四 基本内置包装类型的包装类都有一个Type属性
Class c4 = Integer.TYPE;
System.out.println("c4: "+ c4);
//获得父类型
Class c5 = c1.getSuperclass();
System.out.println("class: " + c5);
}
}
public class Person {
public String name;
public int code;
public Person(String name){
this.name = name;
this.code = 1;
}
public Person(){
}
}
class Student extends Person {
public Student(String name) {
super(name);
this.name = name;
}
}
class Teacher extends Person{
public Teacher(String name){
super(name);
this.name = name;
}
}
类加载内存分析
img_2.png
分析类的初始化
img_3.png
类加载器
img_4.png
img_5.png
获取类运行式结构
package com.yang;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test02 {
//获取类对象
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
//获取类对象
Class c = Class.forName("com.yang.User");
User user = new User();
Class c2 = user.getClass();
//获取类名
System.out.println("***获取类名***");
System.out.println(c.getName());
System.out.println(c.getSimpleName());
System.out.println(c2.getName());
System.out.println(c2.getSimpleName());
//获取类属性
System.out.println("======================================");
System.out.println("***获取类属性***");
System.out.println("获取public属性:");
Field[] field = c.getFields(); //只能找到public属性
for(Field f : field){
System.out.println(f);
}
System.out.println("--------------------------------");
System.out.println("获取所有属性:");
field = c.getDeclaredFields(); //可以找到所有属性
for(Field f : field){
System.out.println(f);
}
//获得指定属性
System.out.println("------------------------------------------");
System.out.println("获取指定属性:");
System.out.println(c.getField("shengao"));//只能找到public属性
System.out.println(c.getDeclaredField("sex"));
System.out.println("===========================================");
//获得类方法
System.out.println("***获取类方法***");
System.out.println("获取该类与父类中的public方法");
Method[] methods = c.getMethods(); //获取public修饰的方法与继承的父类中public的方法
for (Method method : methods) {
System.out.println("正常的: " + method);
}
System.out.println("------------------------------------------");
System.out.println("获取该类中所有方法:");
methods = c.getDeclaredMethods(); //获取该类所有方法, 不包含父类
for (Method method : methods) {
System.out.println( method);
}
System.out.println("------------------------------------------");
//获取指定方法
System.out.println("获取指定:");
System.out.println(c.getMethod("getName"));
System.out.println(c.getMethod("setName", String.class));
System.out.println("===========================================");
//获得构造器
System.out.println("***获取构造器***");
System.out.println("获取public构造器:");
Constructor[] constructors = c.getConstructors(); //获取public修饰的构造器
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
System.out.println("------------------------------------------");
System.out.println("获取所有构造器:");
constructors = c.getDeclaredConstructors(); //获取所有构造器
for (Constructor constructor : constructors) {
System.out.println("$" + constructor);
}
System.out.println("------------------------------------------");
//获得指定构造器
System.out.println("获取指定构造器:");
System.out.println(c.getConstructor());
System.out.println(c.getConstructor(String.class, int.class, String.class, int.class));
System.out.println("===========================================");
}
}
class User{
private String name;
private int id;
private String sex;
public int shengao;
public User(){};
public User(String name, int id, String sex, int shengao) {
this.name = name;
this.id = id;
this.sex = sex;
this.shengao = shengao;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id=" + id +
", sex='" + sex + '\'' +
'}';
}
public String getName() {
return name;
}
public int getId() {
return id;
}
public String getSex() {
return sex;
}
public int getShengao() {
return shengao;
}
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setShengao(int shengao) {
this.shengao = shengao;
}
}
运行结果:
***获取类名***
com.yang.User
User
com.yang.User
User
======================================
***获取类属性***
获取public属性:
public int com.yang.User.shengao
--------------------------------
获取所有属性:
private java.lang.String com.yang.User.name
private int com.yang.User.id
private java.lang.String com.yang.User.sex
public int com.yang.User.shengao
------------------------------------------
获取指定属性:
public int com.yang.User.shengao
private java.lang.String com.yang.User.sex
===========================================
***获取类方法***
获取该类与父类中的public方法
正常的: public java.lang.String com.yang.User.toString()
正常的: public java.lang.String com.yang.User.getName()
正常的: public int com.yang.User.getId()
正常的: public void com.yang.User.setName(java.lang.String)
正常的: public void com.yang.User.setId(int)
正常的: public int com.yang.User.getShengao()
正常的: public void com.yang.User.setSex(java.lang.String)
正常的: public java.lang.String com.yang.User.getSex()
正常的: public void com.yang.User.setShengao(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 com.yang.User.toString()
public java.lang.String com.yang.User.getName()
public int com.yang.User.getId()
public void com.yang.User.setName(java.lang.String)
public void com.yang.User.setId(int)
public int com.yang.User.getShengao()
public void com.yang.User.setSex(java.lang.String)
public java.lang.String com.yang.User.getSex()
public void com.yang.User.setShengao(int)
------------------------------------------
获取指定:
public java.lang.String com.yang.User.getName()
public void com.yang.User.setName(java.lang.String)
===========================================
***获取构造器***
获取public构造器:
public com.yang.User()
public com.yang.User(java.lang.String,int,java.lang.String,int)
------------------------------------------
获取所有构造器:
$public com.yang.User()
$public com.yang.User(java.lang.String,int,java.lang.String,int)
------------------------------------------
获取指定构造器:
public com.yang.User()
public com.yang.User(java.lang.String,int,java.lang.String,int)
===========================================
动态创建对象执行方法
img_6.png
img_7.png
img_8.png
img_9.png
package com.yang;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test03 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//获取类对象
Class c = Class.forName("com.yang.User");
//构造对象
User user = (User) c.newInstance(); //调用无参构造, 必须有无参构造
System.out.println(user);
//通过构造器创建对象
Constructor constructor = c.getConstructor(String.class, int.class, String.class, int.class);
User user2 = (User)constructor.newInstance("yang", 18, "男", 168);
System.out.println(user2);
//通过f反射获取并操作方法
Method method = c.getMethod("setName", String.class);
method.invoke( user2,"hello world");
System.out.println(user2);
//通过反射操作属性
System.out.println("==============================");
Field name = c.getDeclaredField("name");
name.setAccessible(true); //获取访问权限, 取消安全检测, 因为属性是私有的
name.set(user2, "yangjiale");
System.out.println(user2);
}
}
img_10.png
package com.yang;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
public class Test04 {
public void Test01(Map<String,User>s1, List<Integer>s2){
System.out.println("test01");
}
public Map<String,User> Test02(){
System.out.println("test02");
return null;
}
public static void main(String[] args) throws NoSuchMethodException {
Method method = Test04.class.getMethod("Test01", Map.class, List.class);
Type[] genericParameterTypes = method.getGenericParameterTypes(); //获取泛型参数信息
for (Type genericParameterType : genericParameterTypes) {
System.out.println("#" + genericParameterType);
if(genericParameterType instanceof ParameterizedType) //如果泛型的参数类型属于参数化类型,就是想MAP和List这种的,获得其真实的参数类型,就是其中的string和User
{
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println("*" + actualTypeArgument);
}
}
}
method = Test04.class.getMethod("Test02");
Type genericReturnType = method.getGenericReturnType();//获取返回值类型
System.out.println("@" + genericReturnType);
if(genericReturnType instanceof ParameterizedType) //如果类型属于参数化类型
{
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println("%" + actualTypeArgument);
}
}
}
}