• java反射机制的简单使用


    java 反射机制

    反射机制简介 参考地址

    1. 什么是反射机制
      反射机制指程序在运行时能够获取自身的信息。在java中只要给定类的名字,就可以通过反射机制获得类的所有信息
    2. 反射机制的优缺点
      1. 首先了解一下动态和静态的概念
      2. 静态编译:在编译时确定类型,绑定对象,即通过
      3. 动态编译:运行时确定类型,绑定对象。
      4. 反射机制的优点:
        可以实现动态创建对象和编译,体现出很大的灵活性
      5. 反射机制的缺点:
        对性能是有影响的,使用反射基本上是一种解释操作,这种操作总是慢于只直接执行相同的操作。
    3. 利用反射机制能获得什么信息
      利用反射机制可以获得类中的所有信息,不过前提是得知道类的对象

    反射机制的一些相关的代码

    获取运行时类的对象的几种方法

    import java.lang.reflect.Constructor;
    import java.util.Arrays;
    
    import org.junit.Test;
    /**
    *定义一个Worker类来作为示例
    */
    class Worker{
    	String name;
    	int age;
    	int salary;
    	Worker() {
    		
    	}
    	
    	Worker(String name, int age, int salary) {
    		this.name = name;
    		this.age = age;
    		this.salary = salary;
    	}
    	
    	void show(){
    		System.out.println("姓名" + name);
    		System.out.println("年龄" + age);
    	}
    	
    	public String toString() {
    		return "Worker [name=" + name + ", age=" + age + ", salary=" + salary
    				+ "]";
    	}
    	
    }
    
    
    /**
    *通过反射机制获取运行时类的对象的几种方法示例
    */
    public class TestReflection {
    	public static void main(String[] args) throws Exception {
    //		1.通过对象调用getClass方法得到运行时类的对象
    		Worker w1 = new Worker("Jhon", 20, 20000);
    		Class<Worker> clazz1 = (Class<Worker>) w1.getClass(); 
    		Worker w2 = (Worker)(clazz1.newInstance());
    		w2.show();
    		System.out.println(clazz1);
    		
    //		2.通过类来获取运行时类的对象
    		Class clazz2 = Worker.class;
    		System.out.println(clazz2);
    		
    //		3.通过Class.forName(String name)获得运行时类的对象
    		Class clazz3 = Class.forName("Worker");                //注:如果worker类不在缺省包中,括号里面要以包名开头
    		System.out.println(clazz3);
    		
    //		4.通过类的加载器来加载运行时类的对象
    		Class clazz4 = ClassLoader.getSystemClassLoader().loadClass("Worker");   //注:如果worker类不在缺省包中,括号里面要以包名开头
    		System.out.println(clazz4);
    		
    //		得到构造方法并调用对应对象的方法
    		Constructor constructor1 = clazz4.getDeclaredConstructor();
    		(clazz1.cast(constructor1.newInstance())).show();
    		
    		Constructor constructor2 = clazz1.getDeclaredConstructor(String.class, int.class, int.class);
    		Object obj = constructor2.newInstance("Tom",20,20000);
    		System.out.println(obj);
    		
    		Constructor[] constructors = clazz2.getDeclaredConstructors();
    		System.out.println(Arrays.toString(constructors));
    	}
    
    }
    
    

    java反射的通用代码

    通过上面的代码可以获得 运行时类的对象,然后下面使用运行时类的对象来构造一个反射工具类,通过下面这个类 可以利用反射机制实例化该类的对象,设置对象的属性并调用对象的方法

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    //反射工具类
    class ReflectionUtils{
    	//通过运行时类得到相应的对象
    	public static Object getObject(Class clazz) throws Exception{
    		//调用对应类的空构造方法,所以传进来的类的对象对应的类一定得有空的构造方法
    		return clazz.newInstance();
    	}
    	
    	//设置对象属性
    	public static void setField(Object obj,String name,Object value) throws Exception{
    		Class clazz = obj.getClass();
    		Field field = clazz.getDeclaredField(name);
    		field.setAccessible(true);
    		field.set(obj, value);
    	} 
    	
    	//调用对象的方法
    	public static void setMethod(Object obj,String name,Object...args) throws Exception{
    		Class clazz = obj.getClass();
    		//定义Class数组来保存参数对应的类,得到方法时,要用到
    		Class [] clazzs = new Class[args.length];
    		for(int i=0;i<args.length;i++){
    			clazzs[i] = args[i].getClass();
    		}
                    Method method = clazz.getDeclaredMethod(name, clazzs);
    		method.invoke(obj, args);
    	}
    }
    
    

    本博客是根据上课老师讲的知识与网上的资料总结得来的,如需转载请注明出处:http://www.cnblogs.com/zhuchenglin/p/8005559.html

  • 相关阅读:
    Dagger2使用
    Android自定义processor实现bindView功能
    Android注解方式实现表单校验
    一次简单的SQL手工注入
    Drozer简单使用
    Android刷机
    Python Network Security Programming-1
    存在于文件名中的SQL手工注入
    java 动手动脑7
    Java课堂 动手动脑6
  • 原文地址:https://www.cnblogs.com/zhuchenglin/p/8005559.html
Copyright © 2020-2023  润新知