Java反射机制(3):反射机制操作属性、方法、构造器

一、反射机制的常见作用

1、动态加载类、动态获取类的信息(属性,方法,构造器)。
2、动态构造对象。
3、动态调用类和对象的任意方法、构造器。
4、动态调用和处理属性。
5、获取泛型信息。
6、处理注解。

二、bean.User类

javabean必须要有无参的构造器

	public class User {
		private int id;
		private int age;
		private String uname;
		public User(int id, int age, String uname) {
			super();
			this.id = id;
			this.age = age;
			this.uname = uname;
		}
	
		public User() {
			
		}
	
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
		}
		public int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
		public String getUname() {
			return uname;
		}
		public void setUname(String uname) {
			this.uname = uname;
		}
	}

三、通过反射API获取属性、方法、构造器信息

	/**
	 * 应用反射的API获取类的信息(类的名字、属性、方法、构造器)
	 * @author 鹏鹏
	 *
	 */
	@SuppressWarnings("all")
	public class Demo03 {
		public static void main(String[] args) throws NoSuchFieldException {
			String path = "bean.User";
			try {
				Class c = Class.forName(path);
				
				//获取类的包名+名字
				System.out.println(c.getName());
				
				//只获取类名
				System.out.println(c.getSimpleName());
				
				//获取属性信息
				//Field[] fields = c.getFields();   //只能获取public修饰的属性
				//Field[] fields = c.getDeclaredFields()   //获取所有的属性
				Field[] fields = c.getDeclaredFields();
				System.out.println(fields.length);
				
				
				//获取方法信息
				Method[] m = c.getDeclaredMethods();		//只能获取公开的方法
				//Method method = c.getDeclaredMethod("getUname", null);   //第二个参数是方法中参数的类型,区分重载的方法,同名不同参数
				//Method method = c.getDeclaredMethod("setUname",String.class)
				for(Method m1:m)
				{
					System.out.println(m1);
				}
				
				
				//获取构造方法的信息
				Constructor[] cons = c.getConstructors();
				Constructor[] cons2 = c.getDeclaredConstructors();
				for(Constructor con:cons) {
					System.out.println(con);
				}
				
			} catch (ClassNotFoundException  | SecurityException e) {
				e.printStackTrace();
			}

四、通过反射API操作属性、方法、构造器

	/**
	 * 通过反射API动态操作:构造器、方法、属性
	 * @author 鹏鹏
	 *
	 */
	@SuppressWarnings("all")
	public class Demo04 {
		public static void main(String[] args) {
			String path = "bean.User";
			try {
				Class c = Class.forName(path);
				
				//通过反射API动态操作构造器来构造对象
				User user = (User)c.newInstance();      //调用了User的无参构造方法
				System.out.println(user);
				
				//调用有参数构造器
				Constructor con = c.getDeclaredConstructor(int.class,int.class,String.class);
				User user2= (User) con.newInstance(12,21,"pengpeng");
				System.out.println(user2.getUname());
				
				//通过反射API获取普通方法
				User user3 = (User) c.newInstance();
				//下面的两行==user3.setAge(23)
				Method method = c.getDeclaredMethod("setUname", String.class);
				method.invoke(user3, "pengpeng");
				
				//通过反射API操作属性
				Field f = c.getDeclaredField("uname");
				f.setAccessible(true);           //如果属性为private可以设置为可以访问,包括私有方法
				f.set(user3, "pengpeng");        //通过反射写属性的值
				System.out.println(f.getName());   //通过反射读属性值
				System.out.println(f.get(user3));
				
			} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
				e.printStackTrace();
			}

你可能感兴趣的:(java注解,反射机制,java,反射)