关闭

反射

126人阅读 评论(0) 收藏 举报
分类:

面向对象编程的思维是万事万物皆对象,那么类是不是对象,是谁的对象?

在反射当中,类是对象,是Java.lang.Class的对象。

类是对象,那么如何获取对象,获取对象有哪些方法

类对象的获取方法主要有以下三种方法

//任何一个类都有一个静态成员变量Class
 Class c1 = Foo.class;
 Class c2 =foo1.getClass();
Class c3 = Class.forName("com.wxf.reflect.Foo");

一个类主要有构造方法,成员变量,方法,以及个元素的修饰符

c.getMethods()和c.getDeclaredMethods()前者获取到的是所有public方法,包括从父类继承来的,后者只获取当前类的所声明的方法,同样构造方法,成员变量也是如此

 /**
		  * Method类 方法对象
		  * 一个成员方法就是一个Method对象
		  * getMethods()方法获取的是所有public的函数,包括父类集成的
		  * getDeclaredMethodes()自己声明的
		  */
		 Method[] ms = c.getMethods();
		 for(int i =0 ;i <ms.length;i++){
			 Class returnType = ms[i].getReturnType();
			 System.out.print(returnType.getSimpleName()+" ");
			 System.out.print(ms[i].getName()+"(");
			 //获取参数类型
			 Class[] paramTypes = ms[i].getParameterTypes();
			 for(Class class1:paramTypes){
				 System.out.print(class1.getSimpleName()+",");
			 }
			 System.out.println(")");
		 }

这是获取一个类的方法

 Class c = obj.getClass();
		/**
		  *成员变量也是对象
		  *Field
		  */
		 Field[] fs = c.getDeclaredFields();
		 for(Field f :fs){
			 Class fieldType = f.getType();
			 String typeName = fieldType.getName();
			 String fieldName = f.getName();
			 System.out.println(typeName +" " +fieldName);
		 }

获取一个类的成员变量

  Constructor[] cs = c.getDeclaredConstructors();
		  for(Constructor constructor:cs){
			  System.out.print(constructor.getName()+"(");
			  Class[] paramTypes =constructor.getParameterTypes();
			  for(Class class1:paramTypes){
				  System.out.print(class1.getSimpleName()+",");
			  }
			  System.out.println(")");
			  
		  }

获取一个类的构造方法

以上是获取类的信息

下面是用反射去使用类

public class MethodDemo1 {
	    public static void main(String[] args) {
	    	A a1 = new A();
	    	Class c = a1.getClass();
	    	try {
			Method m = 	c.getMethod("print", new Class[]{int.class,int.class});
			m.invoke(a1, new Object[]{10,20});
			//方法的反射操作
			//如果方法没有返回值返回null,如果有返回返回值
			Method m1 = 	c.getMethod("print", new Class[]{String.class,String.class});
			m1.invoke(a1,new Object[]{"hello","world"});
			
			System.out.println("======================");
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException 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);
		
	}
	

下一个是对List的操作,去泛型
public static void main(String[] args) {
		ArrayList list = new ArrayList();
		ArrayList<String>list1 = new ArrayList<String>();
		list1.add("hello");
		Class c1 = list.getClass();
		Class c2 = list1.getClass();
		System.out.println(c1==c2);
		//编译后去泛型
		Method m;
		try {
			m = c2.getMethod("add", Object.class);
			m.invoke(list1, 100);
			System.out.println(list1.size());
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
当然反射也可以改变类的成员变量的值




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:68188次
    • 积分:1532
    • 等级:
    • 排名:千里之外
    • 原创:90篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条