Java中的反射机制(一:实例成员的使用)详尽注解

//反射:实例成员的使用
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test1 {

	public static void main(String[] args) throws Exception {

		//1.Class表示所有的类,所有类的在一起就被称为类类型,如果在类类型中定义某个具体的对象,即创建类对象,c1
		String className = "com.tencent.test.Student";// 具体完整的包路径+类名称
		Class c1 = Class.forName(className);
		
		//2.根据c1类创建对象
			// 2.1调用无参构造方式
		Object o1 = c1.newInstance();
			// 2.2调用带参构造方式
		Constructor con = c1.getConstructor(String.class,int.class);//先使用getConstructor方法时需要指定参数(.class) 
		Object o2 = con.newInstance("张三",19);//再使用newInstance方法时传递一个实参
		
		//3.获取c1类的属性(已经具体为Student类,即获取Student类中的属性)
			//3.1 公开的属性:
		Field f1 = c1.getField("name");
				// 3.1.1获取多个公开的属性
		/*
		    Field[] fs1 = c1.getFields();
		for(Field fds1: fs1){
			System.out.println(fds1);
		}
		 */
		
			//3.2 非公开的属性:
		Field f2 = c1.getDeclaredField("age");
				// 3.2.1获取多个非公开的属性
		/*
		Field[] fs2 = c1.getDeclaredFields();
		for(Field fds2:fs2){
			System.out.println(fds2);
		}
		*/
		
		//4.使用属性(需要先获取属性,即上述步骤3)
			//4.1无参
				//4.1.1给公开的属性赋值取值
		f1.set(o1, "李四");
		Object stuname = f1.get(o1);
		System.out.println("该学生的姓名为:" + stuname);
				//4.1.2给私有的属性赋值取值(必须修改访问权限!!!!)
		f2.setAccessible(true);
		f2.set(o1, 25);
		Object stuage = f2.get(o1);
		System.out.println("该学生的年龄是:" + stuage);
			//4.2带参
		System.out.println(o2);
		
		//5.获取c1类方法(已经具体为Student类,即获取Student类中的方法)
			//5.1无参无返回值
				//5.1.1公开的方法
		Method m1 = c1.getMethod("study");
				//5.1.2私有的方法
		Method m2 = c1.getDeclaredMethod("play");
			//5.2有参有返回值
				//5.2.1公开的方法
		Method m3 = c1.getMethod("look", String.class);
				//5.2.2私有的方法	
		Method m4 = c1.getDeclaredMethod("shooping", int.class);
		
		//6.使用方法(需要先获取方法,即上述步骤5)
			//6.1无参无返回值
				//6.1.1公开的方法
		m1.invoke(o1);
				//6.1.2私有的方法(必须修改访问权限!!!!)
		m2.setAccessible(true);
		m2.invoke(o1);
			//6.2有参有返回值
				//6.2.1公开的方法
		Object in1 = m3.invoke(o1, "海底两万里");
		System.out.println("正在看的书:"+in1);
				//6.2.2私有的方法(必须修改访问权限!!!!)
		m4.setAccessible(true);
		Object in2 = m4.invoke(o1, 126);
		System.out.println("还剩" + in2 + "块钱");
		
	}

}

class Student {
	//1.实例属性
		//1.1公开属性
	public String name;
		//1.2非公开属性
	private int age;

	//2.构造方法
		//2.1无参构造
	public Student(){
		
	}
		//2.2带参构造
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	//3.实例方法
		//3.1无参无返回值
			//3.1.1公开
	public void study() {
		System.out.println("正在学习……");
	}
			//3.1.2非公开
	private void play(){
		System.out.println("正在玩游戏……");
	}
		//3.2有参有返回值
			//3.2.1公开
	public String look(String book){
		String bookName="《"+book+"》";
		return bookName;
	}
			//3.2.2非公开
	private int shooping(int money){
		int surplusMoney=money-25;
		return surplusMoney;
	}
}

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

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

猜你喜欢

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