java 反射详细讲解

一个工作3年以上的程序员(码农)如果还不了解java 反射机制,那么可以考虑转行了。
首先 java 反射是运行时机制,每一个类在jvm加载的时候都会自动创建对应的.class 文件,而这个.class文件就是反射的核心。
还是贴代码吧
1 创建student java类
package com.zh;

/**
 * student 实体类
 * 
 * @author zhangh
 *
 */
public class Student {

    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Student() {
        System.out.print("默认的无参数构造方法!");
    }

    public Student(Integer id, String name) {
        this.id = id;
        this.name = name;
        System.out.print("自定义的有参构造方法!");
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + "]";
    }

    private Student(int a, int b) {
        System.out.println("私有的构造方法!");
    }

    public void method() {
        System.out.print("自定义的public 方法");
    }

    public String method1(String str) {
        System.out.println("自定义的public 方法1,方法参数:" + str);
        return "我是method1 的返回值";
    }

    private void method2() {
        System.out.print("自定义的private 方法2");
    }

    void method3() {
        System.out.print("默认的方法3");
    }

    public static void main(String[] args) {
        System.out.println("我是main方法");
    }
}
2 创建测试类 Demo.java
package com.zh;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;

public class Demo {

    @Test
    public void test3() throws Exception {
        // 1 加载反射
        // System.out.println(s.getClass().getName());
        // System.out.println(Student.class.getName());
        // System.out.println(Class.forName("com.zh.Student").getName());
        // 2获取类的构造方法
        for (Constructor c : Student.class.getDeclaredConstructors()) {
            System.out.println("构造方法:" + c);
        }
        System.out.println("输出默认的构造方法:" + Student.class.getConstructor());
        System.out.println("调用方法生成一个对象:"
                + Student.class.getConstructor().newInstance());
        // 3 获取成员
        for (Field field : Student.class.getDeclaredFields()) {
            System.out.println("成员变量:" + field);
        }
        System.out.println("获取单个name成员变量:"
                + Student.class.getDeclaredField("name"));
        System.out
                .println("获取单个id成员变量:" + Student.class.getDeclaredField("id"));
        // 4 给成员赋值
        Student student = Student.class.getConstructor().newInstance();// 默认一个实例,相当于
                                                                        // new
                                                                        // Student();
        Field FieldId = Student.class.getDeclaredField("id");
        FieldId.setAccessible(true);
        FieldId.set(student, 1);
        Field FieldName = Student.class.getDeclaredField("name");
        FieldName.setAccessible(true);
        FieldName.set(student, "zhangheng_测试反射");
        System.out.println("修改的对象实例:" + student);
        // 5获取方法
        for (Method method : Student.class.getDeclaredMethods()) {
            System.out.println("方法 :" + method);
        }
        // 获取指定的方法(根据方法名反色获取)
        System.out.println("toString 方法:"
                + Student.class.getDeclaredMethod("toString", null));
        System.out.println("method1 方法:"
                + Student.class.getDeclaredMethod("method1", String.class));
        // 反射调用方法
        Method method1Method = Student.class.getDeclaredMethod("method1",
                String.class);
        method1Method.setAccessible(true);
        Object obj = method1Method.invoke(student, "我是反射方法method1 的参数值 ");// 调用方法
                                                                            // 返回的是方法的返回值
        System.out.println("反射调用方法返回:" + obj);
        // main 方法的反射调用
        method1Method = Student.class.getDeclaredMethod("main", String[].class);
        method1Method.setAccessible(true);
        // 第一个参数,对象类型,因为方法是static静态的,所以为null可以,第二个参数是String数组
        // obj = method1Method.invoke(student,(Object)new
        // String[]{"a","b","c"});//调用方法 返回的是方法的返回值
        obj = method1Method.invoke(student, new Object[] { new String[] { "a",
                "b", "c" } });// 调用方法 返回的是方法的返回值
        System.out.println("反射调用main方法返回:" + obj);
    }
}
输出结果
构造方法:public com.zh.Student()
构造方法:private com.zh.Student(int,int)
构造方法:public com.zh.Student(java.lang.Integer,java.lang.String)
输出默认的构造方法:public com.zh.Student()
默认的无参数构造方法!调用方法生成一个对象:Student [id=null, name=null]
成员变量:private java.lang.Integer com.zh.Student.id
成员变量:private java.lang.String com.zh.Student.name
获取单个name成员变量:private java.lang.String com.zh.Student.name
获取单个id成员变量:private java.lang.Integer com.zh.Student.id
默认的无参数构造方法!修改的对象实例:Student [id=1, name=zhangheng_测试反射]
方法 :public static void com.zh.Student.main(java.lang.String[])
方法 :public java.lang.String com.zh.Student.toString()
方法 :public java.lang.String com.zh.Student.getName()
方法 :public java.lang.Integer com.zh.Student.getId()
方法 :public void com.zh.Student.setName(java.lang.String)
方法 :public void com.zh.Student.method()
方法 :public java.lang.String com.zh.Student.method1(java.lang.String)
方法 :private void com.zh.Student.method2()
方法 :void com.zh.Student.method3()
方法 :public void com.zh.Student.setId(java.lang.Integer)
toString 方法:public java.lang.String com.zh.Student.toString()
method1 方法:public java.lang.String com.zh.Student.method1(java.lang.String)
自定义的public 方法1,方法参数:我是反射方法method1 的参数值 
反射调用方法返回:我是method1 的返回值
我是main方法
反射调用main方法返回:null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值