【java-之路】学习反射[基础]

之前上学的时候只闻其名不见其人

几个月前看了关于反射的一些相关视频 今天正好看书的时候也正好看到了反射这一块 正好把反射常用的一些方法简单的梳理一下

代码如下

package cn.sunxyz.reflect;  
/** 
 * @Title: Demo1.java 
 * @Package cn.sunxyz.reflect 
 * @Description: TODO(获取类类型的几种方式) 
 * @author zhuGe
 * @date 2016年3月9日 上午10:15:10 
 * @version V1.0 
 */
public class Demo1 {
	
	public static void main(String[] args) {
		//创建Person的实例对象
		Person person = new Person();
		//加载并获取该Class对象可以通过三种途径
		
		//第一种通过类名获取
		Class c1 = Person.class;
		
		//第二种通过对象获取
		Class c2 = person.getClass();
		
		//第三者通过class.forName();
		Class c3 = null;
		try {
			c3 = Class.forName("cn.sunxyz.reflect.Person");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//通过类的类型创建实例化对象
		try {
			
			//Person p1 = (Person)c1.newInstance();
			//使用newInstance创建对象
			Object o1 = c2.newInstance();
			//向下转型
			Person p1 = (Person)o1;
			p1.print(c1==c2);
			p1.print(c1==c3);
			
			System.out.println("输出对象");
			p1.print(o1);
			p1.print(p1);
			//通过类类型创建的对象与new出来的对象的区别
			System.out.println("-----通过类类型创建的对象与new出来的对象的区别-----");
			p1.print(c1);
			p1.print(person);
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	
}
class Person{
	
	public void print(Object obj){
		System.out.println(obj);
	}
	
}

  

运行结果

true

true
输出对象
cn.sunxyz.reflect.Person@25fe6783
cn.sunxyz.reflect.Person@25fe6783
-----通过类类型创建的对象与new出来的对象的区别-----
class cn.sunxyz.reflect.Person
cn.sunxyz.reflect.Person@613ddcf1

总结:

获取class对象有三种方式 

第一种 通过类名.class获取

第二种 通过对象.getClass()获取

第三种 通过对象所在的全类名进行获取

创建对象可以使用 class类类型.newInstance()(有无参构造)

newIstance(可以有参数)对应对象的构造方法


获取对象的属性 成员方法及构造方法

package cn.sunxyz.reflect;

import cn.sunxyz.reflect.method.Show;
/** 
 * @Title: Demo3.java 
 * @Package cn.sunxyz.reflect 
 * @Description: TODO(同过反射获取类的方法列表) 
 * @author zhuGe
 * @date 2016年3月9日 上午11:28:30 
 * @version V1.0 
 */
public class Demo3 {
	
	public static void main(String[] args) {
		String str = "";
		Show.showMethod(str);
		Show.showField(new Integer(1));
		Show.showConstructor(str);

	}

}
  

package cn.sunxyz.reflect.method;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/** 
 * @Title: ShowMethod.java 
 * @Package cn.sunxyz.reflect.method 
 * @Description: TODO(添加描述) 
 * @author zhuGe
 * @date 2016年3月9日 上午11:28:48 
 * @version V1.0 
 */
public class Show {
	
	public static void showMethod(Object object){
		
		//获取类类型
		Class clazz = object.getClass();
		//getMethods()方法获取的是所有的public的函数,包括父类继承而来的
		// getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
		Method[] method = clazz.getMethods();
		for (Method m : method) {
			Class returnType = m.getReturnType();
			String methodName = m.getName();
			Class[] parameterTypes =  m.getParameterTypes();
			StringBuffer sb = new StringBuffer();
			sb.append(returnType.getSimpleName()+" "+methodName+" (");
			for (Class parameterType : parameterTypes) {
				sb.append(parameterType.getSimpleName()+",");
			}
			if(parameterTypes.length>0){
				sb.deleteCharAt(sb.length()-1);
			}
			
			sb.append(")");
			System.out.println(sb);
		}
		
	}
	
	public static void showField(Object object){
		Class clazz = object.getClass();
		//同成员方法
		Field[] field = clazz.getFields();
		for (Field f : field) {
			Class type = f.getType();
			String fieldName = f.getName();
			System.out.println(type.getSimpleName()+" "+fieldName);
		}
	}
	
	public static void showConstructor(Object object){
		Class clazz = object.getClass();
		Constructor[] constructors = clazz.getConstructors();
		for (Constructor constructor : constructors) {
			//获取修饰符
			int mo=constructor.getModifiers();
			String c = constructor.getName();
			Class[] parameterTypes = constructor.getParameterTypes();
			StringBuffer sb = new StringBuffer();
			sb.append(Modifier.toString(mo)+" "+c+" (");
			for (Class parameterType : parameterTypes) {
				sb.append(parameterType.getSimpleName()+",");
			}
			if(parameterTypes.length>0){
				sb.deleteCharAt(sb.length()-1);
			}
			sb.append(")");
			System.out.println(sb);
		}
		
	}

}
  

运行结果

boolean equals (Object)
String toString ()
int hashCode ()
int compareTo (Object)
int compareTo (String)
int indexOf (String,int)
int indexOf (int)
int indexOf (int,int)
int indexOf (String)
String valueOf (float)
String valueOf (double)
String valueOf (boolean)
String valueOf (char[],int,int)
String valueOf (char[])
String valueOf (Object)
String valueOf (char)
String valueOf (int)
String valueOf (long)
char charAt (int)
int codePointAt (int)
int codePointBefore (int)
int codePointCount (int,int)
int compareToIgnoreCase (String)
String concat (String)
boolean contains (CharSequence)
boolean contentEquals (StringBuffer)
boolean contentEquals (CharSequence)
String copyValueOf (char[],int,int)
String copyValueOf (char[])
boolean endsWith (String)
boolean equalsIgnoreCase (String)
String format (Locale,String,Object[])
String format (String,Object[])
byte[] getBytes ()
byte[] getBytes (String)
void getBytes (int,int,byte[],int)
byte[] getBytes (Charset)
void getChars (int,int,char[],int)
String intern ()
boolean isEmpty ()
int lastIndexOf (int)
int lastIndexOf (int,int)
int lastIndexOf (String,int)
int lastIndexOf (String)
int length ()
boolean matches (String)
int offsetByCodePoints (int,int)
boolean regionMatches (int,String,int,int)
boolean regionMatches (boolean,int,String,int,int)
String replace (char,char)
String replace (CharSequence,CharSequence)
String replaceAll (String,String)
String replaceFirst (String,String)
String[] split (String)
String[] split (String,int)
boolean startsWith (String)
boolean startsWith (String,int)
CharSequence subSequence (int,int)
String substring (int,int)
String substring (int)
char[] toCharArray ()
String toLowerCase ()
String toLowerCase (Locale)
String toUpperCase (Locale)
String toUpperCase ()
String trim ()
void wait (long,int)
void wait (long)
void wait ()
Class getClass ()
void notify ()
void notifyAll ()
int MIN_VALUE
int MAX_VALUE
Class TYPE
int SIZE
public java.lang.String (byte[])
public java.lang.String (byte[],int,int)
public java.lang.String (byte[],Charset)
public java.lang.String (byte[],String)
public java.lang.String (byte[],int,int,Charset)
public java.lang.String (StringBuilder)
public java.lang.String (StringBuffer)
public java.lang.String (int[],int,int)
public java.lang.String (char[],int,int)
public java.lang.String (char[])
public java.lang.String (String)
public java.lang.String ()
public java.lang.String (byte[],int,int,String)
public java.lang.String (byte[],int)
public java.lang.String (byte[],int,int,int)

总结:

不管是获取成员方法还是普通方法及属性 都应该先获得类类型然后通过对应得方法取得返回类型 入参等


对参数进行操作

package cn.sunxyz.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/** 
 * @Title: Demo4.java 
 * @Package cn.sunxyz.reflect 
 * @Description: TODO(方法反射的基本操作) 
 * @author zhuGe
 * @date 2016年3月9日 下午1:04:47 
 * @version V1.0 
 */
public class Demo4 {
	
	public static void main(String[] args) {
		//获取类类型进行反射操作
		Class c = Test.class;
		Test test = null;
		try {
			//通过类类型创建对象
			test = (Test)c.newInstance();
		} catch (InstantiationException | IllegalAccessException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			//根据方法名和参数获取对应
			
			//Method m1 = c.getMethod("print", new Class[]{String.class,String.class});
			Method m1 = c.getMethod("print", String.class,String.class);
			
			//Method m2 = c.getMethod("print", new Class[]{});
			Method m2 = c.getMethod("print");
			
			Method m3 = c.getMethod("print",int.class,int.class);
			try {
				//使用invoke进行方法反射调用
				//等同于test.print("a","b");
				//m1.invoke(test, new Object[]{"a","b"});
				m1.invoke(test, "a","b");
				//m2.invoke(test, new Object[]{});
				m2.invoke(test);
				
				Object obj = m3.invoke(test, 1,5);
				
				System.out.println(obj.getClass());
			} 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 (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

class Test{
	
	public void print(){
		System.out.println("helloWorld");
	}
	
	public int print(int a , int b){
		return a+b;
	}
	
	public void print(String a, String b){
		System.out.println(a+b);
	}
	
}

运行结果:
ab
helloWorld
class java.lang.Integer

总结:

获取类类型之后通过.getMethod(方法名,入参类型)指定需要使用的方法 通过 方法名.invoke(对象,入参)调用指定的方法

当然还有其他很多的方法的调用 比如操作属性使用 field.setAccessible(true); field.set(obj, "男");和invoke()方法使用类似 等。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值