• java反射知识


    java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:
    对于任意一个对象,都能够调用它的任意一个方法和属性;
    这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    动态的获取类中的信息,就是java反射

    java反射的作用示意图(可以对已经定义的代码利用配置文件进行扩展,不用修改源代码,源文件提供了接口,开发者可以编写实现接口的类,类中存在处理请求和应答方式,再进行配置,即可达到原程序的扩展,)

    package reflect.test;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    
    import useclass.Person;
    
    public class reflectDemo {
    	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
    		getFieldDemo();//获取字段
    		creatNewClass();//根据class文件创建对象
    		creatNewClass_2();//有有参数的构造方法实例化
    	}
    	public static void getFieldDemo() throws ClassNotFoundException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InstantiationException {
    		Class cla=Class.forName("useclass.Person");
    		Field f=null;//cla.getField("age");
    		f=cla.getDeclaredField("name");
    		//对私有字段的访问取消权限检查,暴力访问
    		f.setAccessible(true);
    		
    		Object obj=cla.newInstance();
    		f.set(obj,"小强");//把名字设置为小强
    		Object o=f.get(obj);
    		System.out.println(o);
    	}
    	public static void creatNewClass_2() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
    		/*
    		 * 当获取指定名称对应类中的所体现的对象时,
    		 * 而该对象初始化不使用空参数构造,应该先获取到该构造函数
    		 * 通过字节码文件对象即可完成
    		 * 方法是:getConstructor(paramterTypes);
    		 */
    		String name="useclass.Person";
    		Class cla=Class.forName(name);//得到class文件
    		Constructor con=cla.getConstructor(String.class,int.class);//得到指定参数构造函数
    		Object obj=con.newInstance("小强",32);//用指定参数构造函数实例化
    		System.out.println(cla.getFields());
    	}
    	public static void creatNewClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
    		//早期:new的时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存,
    		//并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象
    		useclass.Person p=new useclass.Person();
    		
    		//现在:
    		String name="useclass.Person";
    		//找寻该名称类文件,并加载进内存,,并产生Class对象
    		Class cla=Class.forName(name);
    		//产生该类的对象
    		Object obj=cla.newInstance();//获取带参数的构造函数,并实例化
    		
    	}
    
    }
    
  • 相关阅读:
    关于 __bridge
    关于loadView
    关于ViewDidUnload
    55. Jump Game(中等)
    54. Spiral Matrix(中等)
    48. Rotate Image(中等)
    34. Search for a Range
    18. 4Sum(中等)
    16. 3Sum Closest(中等)
    41. First Missing Positive(困难, 用到 counting sort 方法)
  • 原文地址:https://www.cnblogs.com/lzzhuany/p/4519043.html
Copyright © 2020-2023  润新知