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

来源:互联网 发布:g83指令编程实例 编辑:程序博客网 时间:2024/05/16 05:13

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

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

代码如下

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 blocke.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 blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.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 blocke1.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 blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.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
原创粉丝点击