zoukankan      html  css  js  c++  java
  • day13(反射,BeanUtils包)

    反射,

      获取字节码文件的方式:

        方式一: 对象.getClass();

        方式二: 类名.Class;

        方式三:   Class.forName(String Class);

      通过字节码文件获取对象

        定义一个Student对象

    package day13;
    
    public class Student {
    	private String name;
    	private int age;
    	public Student() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    	public Student(String name, int age) {
    		super();
    		this.name = name;
    		this.age = 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;
    	}
    	@Override
    	public String toString() {
    		return "Student [name=" + name + ", age=" + age + "]";
    	}
        public void run(int a){
        System.out.println("学生已经跑了"+a+"小时了......");
        } }

      

    public class FieldDemo {
    	public static void main(String[] args) throws Exception {
    		//获取字节码文件
    		Class<?> forName = Class.forName("day13.Student");//Student为项目中的全路径 
              //获取对象   
              Object newInstance = forName.newInstance(); } }

        通过字节码文件获取构造方法

    public class FieldDemo {
    	public static void main(String[] args) throws Exception {
    		//获取字节码文件
    		Class<?> forName = Class.forName("day13.Student");
    		//获取构造方法对象
    		Object newInstance = forName.newInstance();
    		//获取构造方法列表
    		Constructor[] declaredConstructors = forName.getDeclaredConstructors();//获取构造方法列表
    		for (Constructor constructor : declaredConstructors) {
    			System.out.println(constructor);
    		}
    		Constructor constructor = forName.getConstructor();//获取空参构造
    		System.out.println(constructor);
    		Constructor<?> constructor2 = forName.getConstructor(String.class,int.class);//获取有参构造
    		System.out.println(constructor2);
    		Constructor<?>[] declaredConstructors2 = forName.getDeclaredConstructors();//获取私有和公有的构造方法列表
    		for (Constructor<?> constructor3 : declaredConstructors2) {
    			System.out.println(constructor3);
    		}
    		Constructor<?> c = forName.getDeclaredConstructor(String.class,int.class);//获取所有的(私有和公有)的有参构造
    		System.out.println(c);
    		Constructor<?> c1 = forName.getDeclaredConstructor();//获取所有的(私有和公有)的无参构造
    		System.out.println(c1);
    	}
    }
    

      

         通过字节码文件和对象为字段赋值

      

    public class FieldDemo {
    	public static void main(String[] args) throws Exception {
    		//获取字节码文件
    		Class<?> forName = Class.forName("day13.Student");
    		//获取构造方法对象
    		Object newInstance = forName.newInstance();
    		//获取字段
    		Field age = forName.getDeclaredField("age");//获取age字段
    		age.setAccessible(true);//如果是私有的则需要打开开关
    		age.set(newInstance,15);//设置age的值为15
    		Field name = forName.getDeclaredField("name");
    		name.setAccessible(true);
    		System.out.println(name.get(newInstance));//赋值前查看其值
    		name.set(newInstance,"张三");
    		System.out.println(name.get(newInstance));//赋值后查看其值
    		System.out.println(newInstance);//打印对象
    	}
    }
    

          通过公共构造方法进行赋值

    public class FieldDemo {
    	public static void main(String[] args) throws Exception {
    		//获取字节码文件
    		Class<?> forName = Class.forName("day13.Student");
    		//获取构造方法对象
    		Object o = forName.newInstance();
    		//获取字段
    		Constructor<?> constructor = forName.getConstructor(String.class,int.class);
    		//通过构造方法调用对象
    		Object newInstance2 = constructor.newInstance("张三",15);//同过构造方法进行赋值
    		System.out.println(newInstance2);
    		
    	}
    }
    

          通过私有构造方法进行赋值

    public class FieldDemo {
    	public static void main(String[] args) throws Exception {
    		//获取字节码文件
    		Class<?> forName = Class.forName("day13.Student");
    		//获取构造方法对象
    		Object o = forName.newInstance();
    		
    		//获取字段
    		Constructor<?> constructor = forName.getDeclaredConstructor(String.class,int.class);
    		constructor.setAccessible(true);
    		//通过构造方法调用对象
    		Object newInstance2 = constructor.newInstance("张三",15);//同过构造方法进行赋值
    		System.out.println(newInstance2);
    	}
    }
    

        通过方法get/Set方法进行赋值

    public class FieldDemo {
    	public static void main(String[] args) throws Exception {
    		//获取字节码文件
    		Class<?> forName = Class.forName("day13.Student");
    		//获取构造方法对象
    		Object o = forName.newInstance();
    		//获取字段
    		Method[] methods = forName.getDeclaredMethods();//获取Student中全部方法
    		for (Method method : methods) {
    			//System.out.println(method);
    		}
    		System.out.println("------------");
    		//Method md = forName.getDeclaredMethod("setName");
    		Method md = forName.getMethod("setName",String.class);//传递参数
    		md.invoke(o, "张三");
    		Method md1 = forName.getDeclaredMethod("getName");//执行getName方法
    		Object name = md1.invoke(o);
    		System.out.println(name);
    	}
    }
    

      通过字节码文件调用方法

      调用Student 类中的run(int a);

    public class FieldDemo {
    	public static void main(String[] args) throws Exception {
    		//获取字节码文件
    		Class<?> forName = Class.forName("day13.Student");
    		//获取构造方法对象
    		Object o = forName.newInstance();
    		//参数一   方法名   参数二  参数类型对象的类   (参数列表)
    		Method m = forName.getMethod("run",int.class);
    		//参数一   对象    参数二   参数值(参数列表)
    		m.invoke(o, 2);
    	}
    }
    

      

    通过反射可以获取类中的所有成员方,成员变量,构造方法(包括私有)。  仅仅只需要一个字符串就可以搞定了

     JavaBean  对数据的封装   其实就是标准类  用于存储字段的

    BeanUtils包

      1.自己书写BeanUtils包

    public class MyBeanUtils {
    	public static void setProperty(Object bean, String name, Object value) {//给单个字段设置值
    		Class<? extends Object> class1 = bean.getClass();
    		ArrayList<String> array=new ArrayList<String>();
    		Field[] fields = class1.getFields();
    		for (int i = 0; i < fields.length; i++) {
    			array.add(fields[i].getName());
    		}
    		Field[] declaredFields = class1.getDeclaredFields();
    		for (int i = 0; i < declaredFields.length; i++) {
    			array.add(declaredFields[i].getName());
    		}
    		if (array.contains(name)) {
    			try {
    				Field field = class1.getDeclaredField(name);
    				field.setAccessible(true);
    				field.set(bean, value);
    			} catch (Exception e) {
    				try{
    				Field field = class1.getField(name);
    				field.set(bean, value);}
    				catch(Exception e1){
    				}
    			} 
    		}else{
    			System.out.println("你输入的字段["+name+"]不存在!");
    		}
    	}
    	public static Object  getProperty(Object bean, String name) {//获取单个属性的值
    		Class<? extends Object> cs = bean.getClass();
    		Object object=null;
    			try {
    				Field field = cs.getDeclaredField(name);
    				field.setAccessible(true);
    				object = field.get(bean);
    			} catch (Exception e) {
    				
    			} 
    		return object;
    	}	
    
    	public static void populate(Object bean, Map map){//设置多个字段值
    		
    		Set keys = map.keySet();
    		for (Object key : keys) {
    			try{
    			setProperty(bean, (String) key, map.get(key));
    			}catch(Exception e){
    				
    			}
    		}
    	}
    }
    

      

  • 相关阅读:
    SDOI2008 Sandy的卡片
    BZOJ2555 Substring
    CTSC2012 熟悉的文章
    递增
    丢失的牛
    【模板】点分治
    陌上花开(三维偏序)
    Holes(河鼠入洞)
    弹飞河鼠
    树状数组1
  • 原文地址:https://www.cnblogs.com/fjkgrbk/p/reflect_day.html
Copyright © 2011-2022 走看看