反射

原创 2016年08月29日 19:14:53

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

在反射当中,类是对象,是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();
		}
	
	}
当然反射也可以改变类的成员变量的值




版权声明:本文为博主原创文章,未经博主允许不得转载。

ReflectUtil反射工具类

  • 2017年11月06日 16:13
  • 5KB
  • 下载

通过java反射获取任意对象的字段名及字段值

import java.lang.reflect.Field; public class ReflectClass3 { /** * @param args */ public sta...
  • CTLLIN
  • CTLLIN
  • 2014年05月09日 00:30
  • 23166

.NET中反射的应用 获取Dll参数

  • 2016年04月06日 17:26
  • 49KB
  • 下载

java反射原理

  • 2016年03月21日 09:30
  • 45KB
  • 下载

iOS反射机制: objc_property_t的使用

objc_property_t在实际开发中用得还是比较多的,例如需要获取一个注册类的属性,或者判断属性的类型,再或者获取属性之后自动给其赋值等等 这里举个获取注册类的所有属性的例子,代码如下: ...

java反射机制

  • 2016年06月05日 21:04
  • 7KB
  • 下载

Java基础与提高干货系列——Java反射机制

前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。 正文 Java反射机制定义 Java...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反射
举报原因:
原因补充:

(最多只允许输入30个字)