java 反射机制

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);
 }

 }
 }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如...
    诺天高云淡阅读 366评论 1 0
  • 一、java的核心机制 java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集...
    Java架构阅读 2,221评论 0 13
  • 不论是 Java 开发 还是 Android 开发,反射、泛型、注解 都是架构设计中很重要的一个知识点。 为了更好...
    JamFF阅读 545评论 0 4
  • 本部分主要介绍:Java 的反射机制的原理及使用 先知知识点 Java 的 接口 (interface)对外提供规...
    sshentree阅读 248评论 0 1
  • 1.理解反射的基础:Class类 众所周知Java有个Object 类,是所有Java 类的继承根源,其内声明了数...
    Cat9527阅读 549评论 1 5