//反射:静态成员的使用
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test2 {
public static void main(String[] args) throws Exception {
// 1.在类类型中定义某个具体的对象,即创建类对象,c1
String className = "com.tencent.test.Dog";// 具体完整的包路径+类名称
Class c1 = Class.forName(className);
//2.获取c1类的静态属性(公开/非公开静态属性的获取方式一致,但是使用非公开的仍需要修改访问权限!!)
//2.1公开
Field f1 = c1.getDeclaredField("name");
/*
Field[] fs1 = c1.getDeclaredFields();
for(Field fds1:fs1){
System.out.println(fds1);
}
*/
//2.2非公开
Field f2 = c1.getDeclaredField("age");
/*
Field[] fs2 = c1.getDeclaredFields();
for(Field fds2:fs2){
System.out.println(fds2);
}
*/
//3.使用静态属性(需要先获取属性,即上述步骤2)
//3.1公开
f1.set(null,"小黄");
Object dogName = f1.get(null);
System.out.println("狗狗的名字是:"+dogName);
//3.2非公开(必须修改访问权限!!!!)
f2.setAccessible(true);
f2.set(null, 5);
Object dogAge = f2.get(null);
System.out.println("狗狗的年龄是:"+dogAge);
//4.获取c1类的静态方法(公开/非公开静态方法的获取方式一致,但是使用非公开的仍需要修改访问权限!!)
//4.1无参无返回值
Method m1 = c1.getDeclaredMethod("play");
Method m2 = c1.getDeclaredMethod("study");
//4.2有参有返回值
Method m3 = c1.getDeclaredMethod("working", String.class);
Method m4 = c1.getDeclaredMethod("running", int.class);
//5.使用静态方法(需要先获取方法,即上述步骤4)
//5.1无参无返回值
//5.1.1公开
m1.invoke(null,null);
//5.1.2非公开(必须修改访问权限!!!!)
m2.setAccessible(true);
m2.invoke(null, null);
//5.2有参有返回值
//5.2.1公开
Object in1 = m3.invoke(null, "看门");
System.out.println("正在"+in1);
//5.2.2非公开(必须修改访问权限!!!!)
m4.setAccessible(true);
Object in2 = m4.invoke(null, 2);
System.out.println("今天跑了"+in2+"米");
}
}
class Dog {
//1.静态属性
//1.1公开
public static String name = "大黄";
//1.2非公开
private static int age = 10;
//2.静态方法
//2.1无参无返回值
//2.1.1公开
public static void play() {
System.out.println("正在玩耍……");
}
//2.1.1非公开
private static void study() {
System.out.println("正在学习技能……");
}
//2.2有参有返回值
//2.2.1公开
public static String working(String work) {
String jobName = work + ",请勿打扰……";
return jobName;
}
//2.2.1非公开
private static int running(int km) {
int m = km * 1000;
return m;
}
}
运行后: