• Java反射机制一 概念和简单的使用方法。


    一 概念 

      java反射机制属于 java动态性之一  ,指的是可以运行时加载,探知,使用编译期间完全未知的类,程序在运行状态中,可以动态的加载一个只有,

    名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法和属性,典型的动态语言有 

    Python ruby javascript等 ,ssh框架大量的用到了反射,如果想知其意,不可不学。

           Class clazz=Class.forName("path"); -加载完类后,在堆内存中,就产生了一个class对象,(一个类只有一个class对象),这个对

    像包含了类的所有的结构信息,我们可以通过这对象看到类的结构,这个对象像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称为:反射。

      初学反射可能看概念有些不能理解反射到底是干什么,相信经过初步的学习之后,再来看这些概念,会觉得原来如此,博主学习感觉一直都是这样。

    二 示例

      User类

    package deadLockThread;
    //我们的实体类
    public class User {
    	private String name;
    	private int id;
    	private int age;
    			
    	public User() {
    		// TODO Auto-generated constructor stub
    	}
    
    	public User(String name, int id, int age) {
    		super();
    		this.name = name;
    		this.id = id;
    		this.age = age;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	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;
    	}
    
    	@Override
    	public String toString() {
    		return "User [name=" + name + ", id=" + id + ", age=" + age + "]";
    	}
    	
    	
    }
    

      获取Class类 获得属性和方法的 api使用

      凡是方法名称带有 Declared  就表示可以获得私有的方法和属性

    String path="deadLockThread.User";
    			Class clazz=Class.forName(path);//两种方法都能获得class对象,第一种具有动态性,可根据外部传来的path选择要加载的类
    			Class clazz1=User.class;//这里用clazz做示范;
    			
    			//常用方法
    			System.out.println("获取类的名字");
    			System.out.println(clazz.getName());//获取类的名字
    			
    			System.out.println("获取类中的属性");
    			
    			Field[] fields=clazz.getDeclaredFields();//获取类中所有的属性
    			
    			clazz.getFields();//获取类中共有的属性,私有不获取
    			
    			System.out.println("--------------------------------------------------------------");
    			//打印输出
    			for (Field field : fields) {
    			System.out.println(field);	
    			}
    			System.out.println("--------------------------------------------------------------");
    			System.out.println("获取类中所有的方法");
    			Method[] methods=clazz.getDeclaredMethods();//获取类中所有的方法
    			Method[] methods2=clazz.getMethods();////获取类中所有的public方法
    			//输出所有方法
    			for (Method method : methods) {
    				System.out.println(method);
    			}
    			
    

      Constructor 构造器的获取和使用

    			Constructor c=clazz.getConstructor(String.class,int.class,int.class);//根据参数得到构造器;
    			User u1=(User)c.newInstance("Test1",45,78);//使用构造器创建一个User对象
    			Constructor[] con= clazz.getDeclaredConstructors();//得到所有的构造器
    			//打印所有的构造器对象
    			for (Constructor constructor : con) {
    				System.out.println(constructor);
    			}
    

      根据Class创建一个对象,并使用class中的方法进行数据操作

                         System.out.println("根据class new一个实例对象");
    			User user=(User)clazz.newInstance();//得到一个实例对象		
    			user.setAge(45);//可直接使用方法  也可使用下面的方法 下面的方法更具有动态性  修改属性值
    			Field fi=clazz.getDeclaredField("age");//根据属性名称得到一个Field					
    			fi.setAccessible(true);//访问检查 将参数这只为true 表示可以访问private属性 不然如果是私有的会报错 
    			fi.set(user, 85);//第一个参数是指定操作的对象,第二个是具体参数
    			System.out.println(user.toString());
    			
                                       System.out.println("使用class的方法调用对象中的方法,更具有动态性");
                     user.toString();//可以直接调用toString方法,也可以用下面的方法
                                  Method me= clazz.getDeclaredMethod("toString",null);//获取方法时方法名称后,要填入该方法的参数,如没有填写null
                  me.setAccessible(true);//访问检查 设置为true 表示禁止检查
                  me.invoke(user, null);//第一个参数是指定操作的对象,第二个是具体参数
                  System.out.println(user.toString());
    

      

      

       

       

  • 相关阅读:
    了解xss
    kail Windows10 远程连接解决办法
    信息收集二级域名或ip收集
    mpvue引用Echarts不渲染问题
    IIS状态码
    apicloud的tapmode用法
    JavaScript交换两个变量值的七种解决方案
    IIS express 服务的开启, 支持多个iis express
    asp.net解决跨域访问问题
    Flex 布局
  • 原文地址:https://www.cnblogs.com/sanduweiliangxtx/p/6134494.html
Copyright © 2020-2023  润新知