反射

 

什么是反射

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

主要作用

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法
  • 生成动态代理

反射API

JAVA提供了反射技术常用的API,位于java.lang.reflect包中

  • Class类——可获取类和类的成员信息:java.lang包下

获取Class类对象的三种方法

  • Field类——可访问类的属性
  1. 通过Class对象获取Filed对象
  2. 调用Filed队形的方法进行取值或赋值操作

方法

说明

Object get(Object obj) 

返回指定对象上此Field对象字段的值 

void set(Object obj, Object value) 

将指定对象上此Field对象表示的字段设置为指定的值

void setAccessible(boolean flag)

设置指定对象上此Field对象表示的字段的可见性

 

  •  
  • Method类——可调用类的方法
  1.  通过Class对象获取Method对象
  2. 调用Method对象的invoke()方法

 

  • Constructor类——可调用类的构造方法
  • 调用无参构造方法创建对象

 

调用有参构造方法创建对象

  • 
    //首先建一个People类
    
    
    //获取类名的三种方法
    
    public static void main(String[]  args){
    
    //获取类名方法一
    Class<People> class1 = People.class;
    System.ou.println("类名称:"+class1.getName());
    
    
    People p1 = new People();
    //获取类名
    Class  class2 = p1.getClass();
    System.out.println("类名: "+class2.getName);
    
    
    try {
    Class class3 = Class.forName("com.zhiyou.reflect.People");
    System.out.println("类名:"+class3.getName());
    			
    } catch (ClassNotFoundException e) {
    	// TODO Auto-generated catch block
    		e.printStackTrace();
    }
    
        
    
    
    
    
    
    
    }
    package com.zhiyou.reflect;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    public class Demo2 {
    
    
    //通过类名获取类中的构造方法,在使用构造方法创建类对象
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
    			Class class1 = Class.forName("com.zhiyou.reflect.People");
    		
    			//获取公共权限(public)的构造方法
    			Constructor[] constructors =  class1.getConstructors();
    			/*for (Constructor constructor : constructors) {
    				//获取方法名称
    				System.out.println(constructor);
    			}*/
    		
    			//获取到类中所有的构造方法
    			Constructor[] constructors2 = class1.getDeclaredConstructors();
    			for (Constructor constructor : constructors2) {
    				System.out.println(constructor);
    			}
    			
    			//获取到无参的构造方法
    			Constructor c1 = class1.getDeclaredConstructor();
    			//通过构造方法创建对象
    			People p1 =  (People)c1.newInstance();
    			System.out.println(p1);
    			
    			//获取到带有参数的构造方法
    			Constructor c2 = class1.getDeclaredConstructor(String.class);
    			//给带有参数的构造方法的参数赋值
    			People p2 = (People) c2.newInstance("张三");
    			System.out.println(p2.name);
    		
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (NoSuchMethodException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SecurityException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		
    		
    	}
    
    }
    
    public class Demo3 {
    
    
    //通过获取的类名创建Field类对象,并获取类中的属性,然后在用创建的对象对属性进行赋值和取值
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		//获取属性
    		try {
    			Class class1 = Class.forName("com.zhiyou.reflect.People");
    			Field[] fields = class1.getDeclaredFields();
    			for (Field field : fields) {
    				System.out.println(field);
    			}
    			
    			//根据属性名称获取属性
    			Field nameField = class1.getDeclaredField("name");
    			
    			//使用无参数的构造方法 创建对象
    			People p1 = (People)class1.newInstance();
    			//p1.name = "李四";
    			/*nameField.set(p1, "李四");
    			System.out.println(p1.name);*/
    			
    			
    			Field heightField = class1.getDeclaredField("height");
    			//设置权限
    			heightField.setAccessible(true);
    			//属性赋值
    			heightField.set(p1, 1.70);
    			//获取属性值
    			System.out.println(heightField.get(p1));
    		
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (NoSuchFieldException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SecurityException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		
    	}
    
    }
    
    package com.zhiyou.reflect;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Demo4 {
    //通过类名创建Method对象,并获取方法,在通过类名创建调用方法的对象,在通过invoke方法调用对象
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
    			Class class1 = Class.forName("com.zhiyou.reflect.People");
    			
    			//获取到本类以及父类中所有的公共方法
    			Method[] methods = class1.getMethods();
    			//获取到本类中所有权限的方法
    			Method[] methods2 = class1.getDeclaredMethods();
    			for (Method method : methods2) {
    				System.out.println(method);
    			}
    			
    			//param1:方法名
    			//param2:方法的参数类型
    			Method method = class1.getDeclaredMethod("sleep", null);
    			Object obj = class1.newInstance();
    			//p1.sleep();
    			//设置权限
    			method.setAccessible(true);
    			//param1:调用方法的对象
    			//param2:调用方法传入的实参
    			method.invoke(obj,null);
    			
    		
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (NoSuchMethodException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SecurityException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		
    	}
    
    }
    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值