zoukankan      html  css  js  c++  java
  • java的反射机制

    class类

      1)在面向对象的世界里,万事万物皆对象。

        Java语言中,静态成员、普通数据类型不是对象。

        类是对象,类是Java.lang.Class类的实例对象。

      public static void main(String[] args) {
            //Foo的实例对象如何表示
            Foo foo1 = new Foo();
            //任何一个类都是一个Class的实例对象,这个实例对象有三种表示方法
            //第一种-->实际告诉我们任何一个类都有一个隐含的静态成员
            Class c1 = Foo.class;
                    
            //第二种-->,已知该类的对象通过getClass方法
            Class c2 = foo1.getClass();
            /*官网c1、c2表示Foo类的类类型
             *万事万物皆对象
             *类也是对象,是Class类的对象
             *这个对象我们称为该类的类类型
             */
            
            //第三种
            Class c3 = null;
            try {
                c3 = Class.forName("com.lei.Foo");
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            //我们完全可以通过类的类类型创建该类的对象实例
            try {
                Foo foo = (Foo)c1.newInstance();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }

    动态加载

      编译时刻加载了是静态加载类,运行时刻加载类是动态加载类。new创建对象是静态加载类,在编译时就需要加载所有的可能使用的。

      通过Class.forName("")动态加载类,运行时加载,通过类类型,创建该类的类对象。上面已经提到。

    java获取方法信息

      public static void printClassMessage(Object object) {
            //首先要获取类的类类型
            Class c = object.getClass();
            //获取类的名称
            System.out.println("类的名称:"+c.getName());
            
            /**
             * getMethods()方法获取的时所有public的函数,包括继承而来的
             * getDeclaredMethods()获取的时所有自己声明的方法,不问访问权限
             */
            Method[] methods = c.getMethods();
            for(int i = 0; i<methods.length; i++) {
                //得到方法的返回值类型的类类型
                Class returnType = methods[i].getReturnType();
                System.out.println(returnType.getName()+"");
                //得到方法的名称
                System.out.println(methods[i].getName()+"(");
                //获取参数类型-->得到参数列表的类型的类类型
                Class[] paramTypes = methods[i].getParameterTypes();
                for(Class class1:paramTypes) {
                    System.out.println(class1.getName()+",");
                }
            }
        }

    java中获取成员变量的信息

      成员变量也是对象

      java.lang.reflet.Field类封装了关于成员变量的操作

      getFields()方法获取的是所有public的成员变量信息

      getDeclaredFied获取的是该类自己声明的成员变量信息

    方法反射

      1) 如何获取某个方法

        方法的名称和方法的参数列表才能唯一决定某个方法

      2)方法的反射操作

        method.invoke(对象,参数列表)

    public class Test {
    	public static void main(String[] args) {
    		A a = new A();
    		Class c = a.getClass();
    		try {
    			//Method m = c.getMethod("print", new Class[] {int.class,int.class});
    			Method m = c.getMethod("print", int.class,int.class);
    			//方法的反射操作
    			//方法的反射操作是用m对象来进行犯法调用,和a.pring()调用的效果相同
    			m.invoke(a,new Object[] {10,20});
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} 
    		
    	}
    }
    
    class A{
    	public void print(int a,int b) {
    		System.out.println(a+b);
    	}
    	
    	public void print(String a,String b) {
    		System.out.println("a"+"b");
    	}
    }
    

      

  • 相关阅读:
    《独立网店经营十招招招制胜》
    行业礼品解决方案集
    北京第一礼品网
    ecshop网店系统+Ucenter用户中心+Cyask问答系统整合
    北京礼品在线入驻CRD核心商业区万达广场
    SEO中的关键字扩展
    礼问天下上线
    好网推荐
    北京礼品在线夏日礼の尚礼品促销第二波
    广告管理中的热点问题
  • 原文地址:https://www.cnblogs.com/leilei0327/p/9077345.html
Copyright © 2011-2022 走看看