十一结束了,盼望着的十一要做的事情也没有做成。有时候的预期和现实总是有些许的变故,Economic freedom--闲扯结束。今天,就简单点。
一、定义
java反射:程序运行时,通过反射获取类的所有属性和方法, 动态创建对象,调用对象的属性和方法。
二、Method
是位于java.lang.reflect包下
在java反射中
共有四种方法:
1、getMethods();获得类的public类型方法
2、getMethod(String name, params);获得类的特定方法
name 参数指定的方法名字、params方法对应的参数
3、getDeclaredMethods();获取类中所有方法(public、protected、default、private)
4、getDeclaredMethod(String name, params);获得类的特定方法
invoke(Object obj, Object arg[]);方法接收的参数必须为对象
三、定义测试类
package com.css.java.learning.massbag;
public class AllMethod {
/*定义两个私有属性
*/
private String name;//测试属性获取
private String sex;//测试获取所有私有属性
/*定义一个有参,公有构造函数
*/
public static String youcan(String aa){
System.err.println("java通过反射操作方法:有参" + aa);
return "success";
}
/*定义一个无参,公有构造函数
*/
public static void wucan(){
System.err.println("java通过反射操作方法:无参");
}
/*定义一个无参,私有构造函数
*/
@SuppressWarnings("unused")
private static void siyou(){
System.err.println("java通过反射操作方法:私有");
}
/*测试私有属性调用和赋值
*/
@SuppressWarnings("unused")
private void shuxing(){
System.err.println(name + "正在利用java反射调用私有属性");
}
/*测试私有属性调用和赋值
*/
@SuppressWarnings("unused")
private void allshuxingh(){
System.err.println(name + sex);
}
}
四、java反射技术的实现
//通过反射操作方法
public static void main(String[] args) {
AllMethod test = new AllMethod();
Class<?> allm = test.getClass();
try {
Method m;
/*公有方法调用
*/
//有参数
m = allm.getMethod("youcan", String.class);
m.invoke(test, "有参数的调用!");//对象和参数
//无参数
m = allm.getMethod("wucan");
m.invoke(test);
/*
* 私有方法调用
*/
m = allm.getDeclaredMethod("siyou");
m.setAccessible(true);
m.invoke(test);
/*获取私有属性
* 和私有属性的赋值
*/
Field filed = allm.getDeclaredField("name");//获取单个私有属性
//设置访问私有属性权限
filed.setAccessible(true);
//调用和设置私有变量属性
filed.set(test, "测试私有属性赋值");
m = allm.getDeclaredMethod("shuxing");
m.setAccessible(true);
m.invoke(test);
Field[] fid = allm.getDeclaredFields();//获取所有私有属性
for (int i = 0; i < fid.length; i++) {
fid[i].setAccessible(true);//权限访问私有属性
fid[i].set(test, i + "测试20181008");
}
m = allm.getDeclaredMethod("allshuxingh");
m.setAccessible(true);//权限访问私有方法
m.invoke(test);
} catch (Exception e) {
e.printStackTrace();
}
}