99. 反射机制动态操作_方法_属性_构造器

反射机制动态操作_方法_属性_构造器

获取类的名字

序号 方法 描述
1 String getName() 获得包名+类名
2 String getSimpleName() 获得类的名字

获得类的属性

序号 方法 描述
1 Field getField(String fieldName) 得到公共的属性对象
2 Field getDeclareField(String fieldName) 得到指定名称的属性对象
3 Field[] c.getDeclaredFields() 得到所有的属性对象

获得类的方法

序号 方法 描述
1 Method[] getDeclaredMethods() 得到公共的方法对象
2 Method[] c.getMethods() 得到父类及本类中的公共方法的对象
3 Method getDeclaredMethod(String methodName ,Class…type) 得到指定名称的本类中公共的方法
4 Method getMethod(String methodName, Class type) 得到本类或者父类中的公共的方法对象

示例:

package com.bjsxt.entity;

public class User {
	//类的属性
	private int userId;
	private String userName;
	private String password;
	//共有的取值赋值方法
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	//带参无参构造,构造器
	public User(int userId, String userName, String password) {
		super();
		this.userId = userId;
		this.userName = userName;
		this.password = password;
	}
	public User() {
		super();
	}
}
package com.bjsxt.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.crypto.CipherInputStream;

public class Test {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException {
		String path = "com.bjsxt.entity.User";
		//1. 获取类的名称
		Class c = Class.forName(path);
		System.out.println(c);
		System.out.println("类的全名称"+c.getName());
		System.out.println("类的名称:"+c.getSimpleName());
		//获取父类的Class对象
		Class cSuperr = c.getSuperclass();
		System.out.println(cSuperr.getName());
		System.out.println(cSuperr.getSimpleName());
		
		//2. 获取类的属性信息
		//Field f = c.getField("UserId"); //只能获取公共的属性
		//System.out.println(f);
		Field[]  fields = c.getFields();//只能获取公共的属性
		System.out.println(fields.length);
		Field[] field2 = c.getDeclaredFields();
		//System.out.println(field2.length);
		for (Field field : field2) {
			//System.out.println(field);//调用了toString方法
			System.out.println(field.getModifiers()+"\t"+field.getType()+"\t"+field.getName());
		}
		
		//3. 获取类的方法信息
		Method[] methods = c.getDeclaredMethods();  //本类中的公共的方法对象
		System.out.println(methods.length);
		for (Method method : methods) {
			System.out.println(method);
			System.out.println("访问权限:"+method.getModifiers());
			System.out.println("返回值类型:"+method.getReturnType());
			System.out.println("方法的名称:"+method.getName());
			//获取方法的参数
			Class[] cpara = method.getParameterTypes();
			for (Class class1 : cpara) {
				System.out.println(class1.getTypeName()+"\t");
			}
			System.out.println("\n-------------------------");
		}
		System.out.println("\n================================");
		//4. 获取类的构造器
		Constructor[] cons = c.getConstructors();
		for (Constructor constructor : cons) {
			System.out.println(constructor);
		}
		System.out.println("\n====================================");
		//获取指定的构造方法
		Constructor con = c.getConstructor(null);//无参构造方法
		System.out.println(con);
		Constructor con2 = c.getConstructor(int.class,String.class,String.class);//得到对应的带参构造方法
		System.out.println(con2);
		/*我们的私有的的属性,共有的取值赋值方法,以及无参构造方法这样的类,我们乘坐javabean*/
	}
}

动态的操作属性, 方法, 构造方法

示例:

package com.bjsxt.entity;

public class User {
	//类的属性
	private int userId;
	private String userName;
	private String password;
	//共有的取值赋值方法
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	//带参无参构造,构造器
	public User(int userId, String userName, String password) {
		super();
		this.userId = userId;
		this.userName = userName;
		this.password = password;
	}
	public User() {
		super();
	}
	
}

package com.bjsxt.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.bjsxt.entity.User;

public class Test2 {//动态的操作属性方法以及构造方法
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
		//获取到Class类的对象
		 Class c = Class.forName("com.bjsxt.entity.User");
		 
		 //1. 得到无参构造方法的对象
		 Constructor cons  = c.getConstructor(null);
		 //通过无参构造方法的对,象创建User类的对象
		 User user = (User) cons.newInstance();
		 
		 //2. 动态的操作属性
		 Field field = c.getDeclaredField("userId");//对userId进行操作
		 field.setAccessible(true);//这个属性不需要做安全检查了,可以直接访问
		 field.set(user, 1001);
		 System.out.println("取出userId这个属性的值:"+field.get(user));//通过反射直接取值
		 
		 //3. 动态操作方法
		 Method m = c.getDeclaredMethod("setUserName", String.class);
		 //执行setUserName方法
		 m.invoke(user, "桃花");
		 Method m2 = c.getDeclaredMethod("getUserName");
		 
		 System.out.println(m2.invoke(user));
		 
		 
	}
}

你可能感兴趣的:(Java)