Java中的反射机制(二:静态成员的使用)详尽注解

//反射:静态成员的使用
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;
	}
}

运行后:
在这里插入图片描述

发布了15 篇原创文章 · 获赞 11 · 访问量 961

猜你喜欢

转载自blog.csdn.net/qq_41414186/article/details/100102704