一个工作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