额,研究过这个的人很多很多,但是我没有很深入的研究过,所以谁也拦不住我去研究研究,然后记录下来······如有雷同··那就雷同了···请多多包涵。

首先是整个项目的结构:

使用到的类:

package reflect.demo;public class Demo {}
package reflect.person;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
public @Data class Person {private String name;private int age;public Person(int age) {super();this.age = age;}public Person(String name) {super();this.name = name;}}
package reflect.person1;public interface China {public static final String name = "xxxxx";public static int age = 12;public void sayChina();public void sayHello(String name, int age);
}
package reflect.person1;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person1 implements China {private String sex;@Overridepublic void sayChina() {System.out.println("hello,china");}@Overridepublic void sayHello(String name, int age) {System.out.println(name + "---" + age);}}
package reflect;import lombok.Getter;
import lombok.Setter;public class HelloOriginal {@Getter@Setterprivate static Class<?> demo;static {try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

1.凡是程序,都以HELLOWORLD来开始,貌似谁也避免不了哩。

package reflect.test1;import reflect.demo.Demo;/*** @author Administrator 通过一个对象获得完整的包名和类名*/
public class Hello {public static void main(String[] args) {Demo demo = new Demo();System.out.println(demo.getClass().getName());}
}

这是反射的最最基础的东西了吧,我新建了一个对象,并且通过这个对象来获得它的class,有了class以后,我就可以操作class的相关信息了,这里我打印出了这个class的name属性。

这里就很容易的理解了反射,反射反射就是反过来搞。我们总是通过类来创建对象,而现在我们通过一个特定的对象(有时候我们不知道这个对象所属什么类)获得了它所归属的类的相关信息。

运行结果:

2.创建class对象的三种方式

package reflect.test2;import reflect.demo.Demo;/*** @author Administrator 实例化Class类对象**/
public class Hello {public static void main(String[] args) {Class<?> demo1 = null;// Class<?>是一种泛型的表达,意思是Object类及其子类都可以放Class<?> demo2 = null;Class<?> demo3 = null;try {// 一般使用的方式,通过指定特定的名称来创建classdemo1 = Class.forName("reflect.demo.Demo");} catch (Exception e) {e.printStackTrace();}demo2 = new Demo().getClass();//通过一个对象来获得classdemo3 = Demo.class;//通过类来获得classSystem.out.println("类名称   " + demo1.getName());System.out.println("类名称   " + demo2.getName());System.out.println("类名称   " + demo3.getName());}}

运行结果:

3.通过反射来创建(实例化)一个对象,使用的是无参构造方法。

package reflect.test3;import reflect.person.Person;/*** @author Administrator 通过Class实例化其他类的对象* *         通过无参构造实例化对象*/
public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person.Person");//获得了特定名称的类的class对象} catch (ClassNotFoundException e) {e.printStackTrace();}Person person = null;try {person = (Person) demo.newInstance();//使用class对象的newInstance()方法就可以创建一个对象了。/*** * * */} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}person.setName("ri");person.setAge(1);System.out.println(person);}
}

4.通过有参的构造方法来构造对象

package reflect.test4;import java.lang.reflect.Constructor;import reflect.person.Person;/*** @author Administrator**         通过Class调用其他类中的构造函数 (也可以通过这种方式通过Class创建其他类的对象)*/
public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person.Person");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}Person per1 = null;Person per2 = null;Person per3 = null;Person per4 = null;Constructor<?> cons[] = demo.getConstructors();try {per4 = (Person) cons[0].newInstance();per3 = (Person) cons[1].newInstance("ri", 12);per1 = (Person) cons[2].newInstance("dd");per2 = (Person) cons[3].newInstance(12);} catch (Exception e) {e.printStackTrace();}System.out.println(per1);System.out.println(per2);System.out.println(per3);System.out.println(per4);}
}

5.通过反射来获得一个类所实现的接口

package reflect.test5;/*** @author Administrator 返回一个类实现的接口*/
public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {e.printStackTrace();}// 获得所有的接口Class<?> intes[] = demo.getInterfaces();for (int i = 0; i < intes.length; i++) {System.out.println("Person1实现的接口:" + intes[i].getName());}}
}

运行结果:

6.通过反射来获得指定类的父类

package reflect.test6;/*** @author Administrator 取得其他类中的父类*/
public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}Class<?> superClass = demo.getSuperclass();System.out.println("继承的父类为" + superClass.getName());}
}

运行结果:

7.通过反射来获得指定类中的构造方法

package reflect.test7;import java.lang.reflect.Constructor;/*** @author Administrator获得其他类中的全部构造函数**/
public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}Constructor<?> cons[] = demo.getConstructors();for (Constructor<?> con : cons) {System.out.println(con);}}
}

8.通过拼装的方式来获得构造方法(本质是获得构造方法的各种信息,我们也可以用在类的各种方法上)

package reflect.test8;import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;import reflect.HelloOriginal;/*** @author Administrator 拼装获得构造方法的全部内容*/
public class Hello extends HelloOriginal {public static void main(String[] args) {Constructor<?>[] cons = getDemo().getConstructors();for (Constructor<?> con : cons) {Class<?>[] pts = con.getParameterTypes();System.out.print("构造方法:  ");int mo = con.getModifiers();System.out.print(Modifier.toString(mo) + " ");System.out.print(con.getName());System.out.print("(");for (int i = 0; i < pts.length; i++) {System.out.print(pts[i].getName() + " arg" + i);if (i < pts.length - 1) {System.out.print(",");}}System.out.println("){}");}}
}

9.拼装类中的所有方法的签名

package reflect.test9;import java.lang.reflect.Method;
import java.lang.reflect.Modifier;import reflect.HelloOriginal;/*** @author Administrator拼接获得类中普通方法的所有内容(方法签名)**/
public class Hello9 extends HelloOriginal {public static void main(String[] args) {/*获得类中的所有方法*/Method[] methods = getDemo().getMethods();for (Method method : methods) {Class<?> returnType = method.getReturnType();/*获得方法的返回类型的class实例*/Class<?>[] pts = method.getParameterTypes();/*获得方法参数的class实例的数组*/int tem = method.getModifiers();/*获得方法的修饰符*/System.out.print(Modifier.toString(tem) + " ");System.out.print(returnType.getName() + " ");System.out.print(method.getName() + "(");for (int i = 0; i < pts.length; i++) {System.out.print(pts[i].getName() + "arg" + i);if (i < pts.length - 1) {System.out.print(",");}}Class<?>[] execs = method.getExceptionTypes();/*获得方法抛出的异常*/if (execs.length > 0) {System.out.print(") throws ");for (int j = 0; j < execs.length; j++) {System.out.print(execs[j].getName() + " ");if (j < execs.length - 1) {System.out.print(",");}}} else {System.out.print(")");}System.out.println("{}");}}
}

10.通过反射获得本类以及继承的属性

package reflect.test10;import java.lang.reflect.Field;
import java.lang.reflect.Modifier;import reflect.HelloOriginal;/*** @author Administrator取得其他类的全部属性吧**/
public class Hello extends HelloOriginal {public static void main(String[] args) {System.out.println("=================本类全部属性=====================");Field[] fields = getDemo().getDeclaredFields();for (int i = 0; i < fields.length; i++) {// 权限修饰符int mo = fields[i].getModifiers();String priv = Modifier.toString(mo);// 属性类型Class<?> type = fields[i].getType();System.out.println(priv + " " + type.getName() + " "+ fields[i].getName() + ";");}System.out.println("===============实现的接口或者父类的属性========================");Field[] fields1 = getDemo().getFields();for (Field filed : fields1) {// 权限修饰符int mo = filed.getModifiers();String priv = Modifier.toString(mo);// 属性类型Class<?> type = filed.getType();System.out.println(priv + " " + type.getName() + " "+ filed.getName() + ";");}}
}

11.通过反射来调用其他类中的方法

package reflect.test11;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import reflect.HelloOriginal;/*** @author Administrator 通过反射调用其他类中的方法*/
public class Hello extends HelloOriginal {public static void main(String[] args) {try {Method method = getDemo().getMethod("sayChina");method.invoke(getDemo().newInstance());method = getDemo().getMethod("sayHello", String.class, int.class);method.invoke(getDemo().newInstance(), "34324", 33);} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} 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 (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

12.通过反射调用其他类的get和set方法

package reflect.test12;import java.lang.reflect.Method;import reflect.HelloOriginal;/*** @author Administrator 调用其他类的set和get方法*/
public class Hello extends HelloOriginal {public static void main(String[] args) throws Exception {Object obj = getDemo().newInstance();setter(obj, "Sex", "男", String.class);getter(obj, "Sex");}public static void getter(Object obj, String att) throws Exception {Method method = obj.getClass().getMethod("get" + att);System.out.println(method.invoke(obj));}public static void setter(Object obj, String att, Object value,Class<?> type) throws Exception {Method method = obj.getClass().getMethod("set" + att, type);method.invoke(obj, value);}
}

13.通过反射操作其他类的属性

package reflect.test13;import java.lang.reflect.Field;import reflect.HelloOriginal;
import reflect.person1.Person1;/*** @author Administrator 通过反射操作属性*/
public class Hello extends HelloOriginal {public static void main(String[] args) throws Exception {Object obj = getDemo().newInstance();Field field = getDemo().getDeclaredField("sex");field.setAccessible(true);field.set(obj, "女");System.out.println(((Person1) obj).getSex());}
}

14.通过反射获取并修改数组的信息

package reflect.test14;import java.lang.reflect.Array;import reflect.HelloOriginal;/*** @author Administrator 通过反射获取并修改数组的信息*/
public class Hello extends HelloOriginal {public static void main(String[] args) {int[] tem = { 1, 2, 3, 4, 5 };Class<?> test = tem.getClass().getComponentType();System.out.println("数组类型" + test.getName());System.out.println("数组长度  " + Array.getLength(tem));System.out.println("数组的第一个元素: " + Array.get(tem, 0));Array.set(tem, 0, 100);System.out.println("修改之后数组第一个元素为: " + Array.get(tem, 0));}
}

15.通过反射修改数组的大小

package reflect.test15;import java.lang.reflect.Array;/*** @author Administrator 通过反射修改数组大小*/
public class Hello {public static void main(String[] args) {int[] temp = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };int[] newTmep = (int[]) arrayInc(temp, 15);print(newTmep);String[] atr = { "a", "b", "c" };String[] str1 = (String[]) arrayInc(atr, 8);print(str1);}public static Object arrayInc(Object obj, int len) {Class<?> tem = obj.getClass().getComponentType();Object newArr = Array.newInstance(tem, len);int co = Array.getLength(obj);System.arraycopy(obj, 0, newArr, 0, co);return newArr;}public static void print(Object obj) {Class<?> clazz = obj.getClass();if (!clazz.isArray()) {return;}System.out.println("数组长度为----" + Array.getLength(obj));for (int i = 0; i < Array.getLength(obj); i++) {System.out.println(Array.get(obj, i));}}
}

16.通过反射获得类加载器

package reflect.test16;import reflect.person.Person;/*** @author Administrator 获得类加载器*/
public class Hello {public static void main(String[] args) {Person person = new Person();System.out.println(person.getClass().getClassLoader().getClass());}
}

17.使用java的代理

package reflect.subject;public interface Subject {public String say(String name, int age);
}
package reflect.subject;public class RealSubject implements Subject {@Overridepublic String say(String name, int age) {return name + "  " + age;}}
package reflect.subject;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class MyInvocationHandler implements InvocationHandler {private Object obj = null;public Object bind(Object obj) {this.obj = obj;return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println(proxy.getClass());return method.invoke(this.obj, args);}}
package reflect.test17;import reflect.subject.MyInvocationHandler;
import reflect.subject.RealSubject;
import reflect.subject.Subject;/*** @author Administrator 动态代理测试*/
public class Hello {public static void main(String[] args) {MyInvocationHandler demo = new MyInvocationHandler();Subject sub = (Subject) demo.bind(new RealSubject());String info = sub.say("xxxxx", 20);System.out.println(info);}
}

java反射的使用概览相关推荐

  1. 大家都说 Java 反射效率低,你知道原因在哪里么

    [这是 ZY 第 17 篇原创技术文章] 预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中, ...

  2. dwr java有返回值但是js获取不到返回值_一探究竟:Java反射效率低的原因到底在哪?...

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中,难免会接触到反射,而在一些框架中,反射的运 ...

  3. Java 反射 (快速了解反射)

    反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  4. java反射最佳实践,java反射性能测试分析

    java反射性能测试分析 java有别于其他编程语言而让我着迷的特性有很多,其中最喜欢的是接口设计,他让我们设计的东西具有美感.同样反射也是我比较喜欢的一个特性,他让程序自动运行,动态加载成为了可能, ...

  5. java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class

    一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...

  6. Java反射以及应用

    需求:需要通过反射动态获取类的字段类型,然后做特殊处理 Java反射getDeclaredField和getField的区别 getDeclaredFiled 只能获取类本身的属性成员(包括私有.共有 ...

  7. java反射用在哪里_Java反射

    昨天去参加比赛了,所以没有进行博客迁移.人生中的第一场健体比赛,虽然没得奖,但是收获和带来的思考颇丰.意外地进入了男子B组(174以上)的半决赛,然后在半决赛的时候还被裁判员点名出去单独比较,这个很让 ...

  8. Java反射(详述版)

    一.什么是反射? 我们先来看一个例子: package venus; public class Student {public String name;public Student(){System. ...

  9. java 反射 动态代理

    在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...

最新文章

  1. 基于Java语言构建区块链(一)—— 基本原型
  2. 隐性饥饿谋定功能性农业-农业大健康·万建民:对接精准扶贫
  3. winform 与WPF
  4. make找不到linux内核函数,linux内核make menuconfig出错
  5. macOS 10.11.* 安装scrapy
  6. Spring定时器的运用
  7. PDF控件PDF Creator V5.5.2.3发布 | 支持插入PDF417条形码
  8. 【xsong说算法】剑指offer一个月打卡完毕
  9. 如何一次性批量打印PDF、Word、Excel、PPT和图片 - 文件批量打印工具
  10. [人工智能-综述-9]:科学计算、大数据分析、人工智能、机器学习、深度学习全面比较
  11. 新一代同步控制器和触摸屏组合在压延机上的应用
  12. RTSP、RTMP、HTTP流媒体播放器比较
  13. 买手机时几GB+几GB啥意思
  14. 如何制作精美的PPT动画?快速学会这3步,开场效果简洁又生动!
  15. Aquaculture Equipment 水产养殖设备谷歌Google搜索量和海外市场竞争度分析
  16. 模型预测控制(MPC)——动态矩阵控制(DMC)
  17. 百度网盘加速下载教程
  18. 删除dataframe中的某行 删除不掉是为啥
  19. 转:通信里 星座图 到底是什么
  20. cov(x+y_cov(2X,2Y)=2cov(X,Y)

热门文章

  1. 如何用手机打开dcm格式图片_如何防止自己的图片被盗用?这 4 招教你优雅加水印...
  2. ❤️六W字《计算机基础知识》(四)(建议收藏)❤️
  3. 数控机床需要c语言程序吗,数控机床编程与操作--详细介绍
  4. javascript V8引擎垃圾收集机制
  5. ps efgrep mysql 命令_mysql常用管理命令
  6. 项目职责_项目经理的9个职责
  7. 使用MATLAB GUI创建图形用户界面GUI
  8. linux装服务器系统,linux服务器系统安装
  9. android代码打开数据库,android – 如何正确关闭并重新打开Room数据库
  10. linux系统怎么删除打印机,解决LINUX ES3.0下想指定打印机和用户的删除打印作业的问题...