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");
	}
}

  

posted @ 2018-05-23 16:00  雷小喵  阅读(142)  评论(0)    收藏  举报