反射

package com.cntaiping.tpi.claimplat.serviceapi.Test1.demo04;

public class Student {
	
	//成员变量
	private String name;
	public int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Student(String name) {
		super();
		this.name = name;
	}
	public Student(int age) {
		super();
		this.age = age;
	}
	public Student() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Student [age=" + age + ", name=" + name + "]";
	}

}

  

package com.cntaiping.tpi.claimplat.serviceapi.Test1.demo04;

import java.lang.reflect.Constructor;//别导错包

public class StudentTest1 {
	
	public static void main(String[] args) throws Exception {
		//获取字节码对象
	Class aClass =Student.class;
	Student newInstance = (Student)aClass.newInstance();//newInstance:创建该类型的一个实例
	
	Constructor c1 = aClass.getDeclaredConstructor(String.class);//getConstructor(Class<?>... parameterTypes)只返回制定参数类型访问权限是public的构造器
	                        //getDeclaredConstructor(Class<?>... parameterTypes)返回制定参数类型的所有构造器,私有和公有的都可以
	Constructor c2 = aClass.getDeclaredConstructor(int.class);//
	Constructor c3 = aClass.getDeclaredConstructor();//无参
	Constructor c4 = aClass.getDeclaredConstructor(String.class,int.class);//顺序不能反
	System.out.println(c1);
	System.out.println(c2);
	System.out.println(c3);
	System.out.println(c4);
	
	Student s1 = (Student)c1.newInstance("张三");//newInstance:创建该类型的一个实例
	Student s2 = (Student)c2.newInstance(18);
	Student s3 = (Student)c3.newInstance();
    Student s4 = (Student)c4.newInstance("李四",28);
	
	System.out.println(s1);
	System.out.println(s2);
	System.out.println(s3);
	System.out.println(s4);
	
	//getFields:获取public修饰的所有属性,返回一个Field数组(包括父类的)
	//getDeclaredFields:获取所有属性,返回一个Field数组
	//getField:传入一个参数(属性名),获取单个属性,返回一个Field对象,只能获取public修饰的
	//getDeclaredField:传入一个参数(属性名),获取单个属性,返回一个Field对象
	//getMethods:获取所有的public修饰的方法,包括父类的,返回Method
	//getDeclaredMethods:获取所有的返回,不包括父类,返回Method数组
	//getMethod:传入一个参数(方法名),返回一个Method对象,只能获取到public修饰的
	//getDeclared:传入一个参数(方法名),返回一个Method对象
	//newInstance:创建该类型的一个实例

	
	}

}

  

package com.cntaiping.tpi.claimplat.serviceapi.Test1.demo04;

import java.lang.reflect.Field;

public class StudenTest2 {
public static void main(String[] args) throws Exception {
	//获取字节码对象
	Class c = Student.class;
	//创建Student对象
	Student newInstance = (Student)c.newInstance();//创建一个实例
	//获取成员变量
	Field namefield = c.getDeclaredField("name");//getDeclaredField仅能获取类本身的属性成员(包括私有、共有、保护)
	Field agefield = c.getField("age");//getField只能获取public的字段,包括父类的
	namefield.setAccessible(true);//暴力反射

	namefield.set(newInstance,"张三");
	agefield.set(newInstance, 18);
	
	System.out.println(newInstance);

}
}

  

posted @ 2021-05-11 14:48  步江伍德  阅读(43)  评论(0)    收藏  举报