• java反射


    通过一个对象获得完整的包名和类名

    package reflect;
    
    public class GetClass {
    	public static void main(String[] args) {
    		GetClass c=new GetClass();
    		System.out.println(c.getClass().getName());
    		System.out.println("结果是reflect.GetClass");
    		Demo d=new Demo();
    		System.out.println(d.getClass().getName());
    		System.out.println("结果是reflect.Demo");
    	}
    }
    class Demo{
    	
    }
    

     

    所有类的对象其实都是Class的实例。

     实例化class对象

    package reflect;
    
    public class GetClass {
    	public static void main(String[] args) {
    		Class<?> demo1=null;
            Class<?> demo2=null;
            Class<?> demo3=null;
            demo1=Demo.class;
            demo2=new Demo().getClass();
            try {
    			demo3=Class.forName("reflect.Demo");
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
            System.out.println("demo1,2,3的值是class reflect.Demo");
            System.out.println("类名称   "+demo1.getName());
            System.out.println("类名称   "+demo2.getName());
            System.out.println("类名称   "+demo3.getName());
            System.out.println("他们的值都是reflect.Demo");
    	}
    }
    class Demo{
    	
    }
    

      

    通过一个类获取其所有的属性

     

    package reflect;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    public class hello {
    	public static void main(String[] args) {
    		/*获取本类的全部属性*/
    		  Class<?> demo = null;
    		 /* try {
    			demo=Class.forName("reflect.Demo");
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} */
    		 // demo=Demo.class;
    		  demo=new Demo().getClass();
    		  //获取某个类所声明的字x段(包括public、private、protected)
    		  Field[] field=demo.getDeclaredFields();
    		  for(int i=0;i<field.length;i++){
    			  //返回修饰符的编码
    			  int mo=field[i].getModifiers();
    			  //获取修饰符名称
    			  String decorate=Modifier.toString(mo);
    			  //输出修饰符名称
    			  System.out.println(decorate);
    			  //获取属性类型
    			  Class<?> type=field[i].getType();
    			  //输出属性类型
    			  System.out.println(type);
    			  //获取属性名称
    			  System.out.println(field[i].getName());
    			  
    			  //如果要获取其自身的属性和其父类或者接口的属性,用
    			  //Field[] field=demo.getFields();这个方法
    		  }
    	}
    }
    class Demo{
    	public String name;
    	public String age;
    	private int id;
    	
    }
    

     输出结果是

    public
    class java.lang.String
    name
    public
    class java.lang.String
    age
    private
    int
    id
    

    通过class调用其他类中的构造函数

    package Reflect;
     
    import java.lang.reflect.Constructor;
     
    class Person{
         
        public Person() {
             
        }
        public Person(String name){
            this.name=name;
        }
        public Person(int age){
            this.age=age;
        }
        public Person(String name, int age) {
            this.age=age;
            this.name=name;
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
        @Override
        public String toString(){
            return "["+this.name+"  "+this.age+"]";
        }
        private String name;
        private int age;
    }
     
    class hello{
        public static void main(String[] args) {
            Class<?> demo=null;
            try{
                demo=Class.forName("Reflect.Person");
            }catch (Exception e) {
                e.printStackTrace();
            }
            Person per1=null;
            Person per2=null;
            Person per3=null;
            Person per4=null;
            //取得全部的构造函数
            Constructor<?> cons[]=demo.getConstructors();
            try{
                per1=(Person)cons[0].newInstance();
                per2=(Person)cons[1].newInstance("Rollen");
                per3=(Person)cons[2].newInstance(20);
                per4=(Person)cons[3].newInstance("Rollen",20);
            }catch(Exception e){
                e.printStackTrace();
            }
            System.out.println(per1);
            System.out.println(per2);
            System.out.println(per3);
            System.out.println(per4);
        }
    }
    

    【运行结果】:

    [null  0]

    [Rollen  0]

    [null  20]

    [Rollen  20]

    关于反射中invoke方法的使用

    method.invoke(Object obj, Object args[])

    obj是个对象,必须是实例化的对象。args是个用于方法调用的参数,是Object数组,因为参数可能有多个。

    Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传入参数。

    package reflect;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Test {
    	public static void main(String[] args) {
    		String [] names ={"tom","tim","allen","alice"};
    		Class<?> clazz=hi.class;
    		Method method = null;
    		try {
    			method=clazz.getMethod("sayHi", String.class);
    		} catch (NoSuchMethodException e) {
    			e.printStackTrace();
    		} catch (SecurityException e) {
    			e.printStackTrace();
    		}
    		for(String name:names){
    			try {
    				method.invoke(clazz.newInstance(), name);
    			} 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();
    			} catch (InstantiationException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		
    	}
    
    }
    class hi{
    	public void sayHi(String name){
    		System.out.println("hi,"+name);
    	}
    }
    

     

    结果 

    hi,tom
    hi,tim
    hi,allen
    hi,alice

     getDeclaredMethod

    public Method getDeclaredMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException
    

    java.lang.Class.getDeclaredMethod()方法返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法。name参数是一个字符串,指定所需的方法的简单名称,parameterTypes参数是一个数组的Class对象识别方法的形参类型,在声明的顺序

    例如

    Method realMethod = serviceProcessor.getClass().getDeclaredMethod(methodName,JSONObject.class);
    			
    			JSONObject paramJson =  (JSONObject) JSONObject.parse(param);
    			
    			String data = ((String) realMethod.invoke(serviceProcessor, paramJson));
    

     .class和.getClass的区别

    出现的时期不同:Class.forName()在运行时加载;Class.class和getClass()是在编译器加载,即.class是静态加载,.getClass()是动态加载。

    .getClass()是一个对象实例的方法,只有对象实例才有这个方法,具体的类是没有的。类的Class类实例是通过.class获得的,显然,类没有.getClass()方法。 

    如:

    protected  Logger log=Logger.getLogger(this.getClass());
    protected static final Logger log=Logger.getLogger(HttpUtil.class);
    

     注意this是当前类的实例,static表示是静态的 

  • 相关阅读:
    设计模式-策略模式
    .NET操作RabbitMQ组件EasyNetQ使用中文简版文档。
    LayIM项目之基础数据获取代码优化,Dapper取代ADO.NET
    干货!手把手教你如何使用第三方通讯服务实现LayIM Socket组件开发。
    几句代码简单实现IoC容器
    .NET Core On Mac 第一步,配置环境
    Func<T,T>应用之Elasticsearch查询语句构造器的开发
    四个人17分钟过桥的问题
    ElasticSearch中的简单查询
    ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十四)之漏掉的客服消息
  • 原文地址:https://www.cnblogs.com/JAYIT/p/5585395.html
Copyright © 2020-2023  润新知