1、java反射概念

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

  JAVA反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

2、Class类

  Class类用于表示一个.class文件,通过这个类的Class对象可以反射出该类的字段、方法、构造函数、注释等等。任何数据类型都有自己的Class对象。

  获得Class对象的方式有三种:

 package reflect;

 public class Dog {

     public static void main(String[] args) throws Exception {
//1、
Class clazz1 = Class.forName("reflect.Dog");
System.out.println(clazz1.getName()); //2、
Class clazz2 = Dog.class;
System.out.println(clazz2.getName()); //3、
Class clazz3 = new Dog().getClass();
System.out.println(clazz3.getName());
} }

运行结果:

reflect.Dog
reflect.Dog
reflect.Dog

3、Constructor类

  Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。Constructor 类的实例对象代表一个类的构造方法。

  3.1、得到某个类所有的构造方法,例:

    Constructor [] constructors= Class.forName("java.lang.String").getConstructors();

  3.2、得到某一个构造方法,例:

    Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

  3.3、利用构造方法创建实例对象:
    String str = (String)constructor.newInstance(“abc”);

  3.4、Class类的newInstance()方法也可创建类的实例,其内部工作原理是先得无参的构造方法,再用构造方法创建实例对象。
    String obj =(String)Class.forName("java.lang.String").newInstance();

  

 package reflect;

 import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List; public class Dog {
private int id;
private String name;
private List list; private Dog(List list) {
this.list = list;
System.out.println("反射私有构造函数");
} public Dog() {
System.out.println("dog");
} public Dog(String name) {
this.name = name;
} public Dog(String name, int id) {
this.name = name;
this.id = id;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public static void main(String[] args) throws Exception { Class clazz = Class.forName("reflect.Dog");
//得到某个类所有的构造方法
Constructor[] Constructors = clazz.getConstructors(); //反射无参构造方法
Constructor c1 = clazz.getConstructor(null);
Dog d = (Dog) c1.newInstance(null); //反射Dog(String name)构造函数
Constructor c2 = clazz.getConstructor(String.class);
Dog d2 = (Dog) c2.newInstance("guoguo");
System.out.println("d2:"+d2.getName()); //反射public Dog(String name, int id)构造函数
Constructor c3 = clazz.getConstructor(String.class, int.class);
Dog d3 = (Dog) c3.newInstance("guoguo",12);
System.out.println("d3:"+d3.getId()+"--"+d3.getName()); //反射private Dog(List list)构造函数
Constructor c4 = clazz.getDeclaredConstructor(List.class);
c4.setAccessible(true);  
Dog d4 = (Dog) c4.newInstance(new ArrayList()); //或者通过class.newIntance获取对象
Dog d5 = (Dog) clazz.newInstance();
}
}

运行结果:

dog
d2:guoguo
d3:12--guoguo
反射私有构造函数
dog

3、Field类

  Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。

  

 package reflect;

 import java.lang.reflect.Field;
import java.util.List; public class Dog {
private int id;
private String name;
private List list; private Dog(List list) {
this.list = list;
System.out.println("反射私有构造函数");
} public Dog() {
System.out.println("dog");
} public Dog(String name) {
this.name = name;
} public Dog(String name, int id) {
this.name = name;
this.id = id;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public static void main(String[] args) throws Exception { Class clazz = Class.forName("reflect.Dog"); //获取所有成员变量
Field[] fs = clazz.getDeclaredFields();
for (Field f : fs) {
System.out.println(f.getName());
} //private String name; 给变量赋值
Dog d1 = new Dog();
Field f1 = clazz.getDeclaredField("name");
f1.setAccessible(true);
f1.set(d1, "guoguo");
System.out.println();
System.out.println("d1:"+d1.getName()); //获取变量的值
Dog d2 = new Dog("guoguo");
Field f2 = clazz.getDeclaredField("name");
f2.setAccessible(true);
System.out.println();
System.out.println("d2:"+f2.get(d2));
}
}

运行结果:

id
name
list
dog

d1:guoguo

d2:guoguo

4、Method类

  Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反射的方法可能是类方法或实例方法(包括抽象方法)。

  得到类中的某一个方法:

    例子: Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);

  调用方法:
    通常方式:System.out.println(str.charAt(1));
    反射方式: System.out.println(charAt.invoke(str, 1));
  如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法!

 package reflect;

 import java.lang.reflect.Method;

 public class Dog {

     public void run() {
System.out.println("run1...");
} public void run(String str) {
System.out.println("run2....");
}
public void run(String str1, String[] str2, int[] id) {
System.out.println("run3....");
} private void say() {
System.out.println("say..");
} private String say(String str) {
return str;
} public static void eat() {
System.out.println("eat...");
} public static void main(String[] args) throws Exception {
Class clazz = Class.forName("reflect.Dog");
Dog d = (Dog) clazz.newInstance(); //反射public void run()
Method run1 = clazz.getMethod("run",null);
run1.invoke(d,null); //反射public void run(String str)
Method run2 = clazz.getMethod("run",String.class);
run2.invoke(d, "str1"); //反射public void run(String str1,String str2)
Method run3 = clazz.getMethod("run",String.class,String[].class,int[].class);
run3.invoke(d, "str", new String[]{"1","2"},new int[]{1}); //反射私有方法private void say()
Method say = clazz.getDeclaredMethod("say", null);
say.setAccessible(true);
say.invoke(d, null); //反射带返回值的方法private String say(String str)
Method say2 = clazz.getDeclaredMethod("say", String.class);
say2.setAccessible(true);
String result = (String) say2.invoke(d, "aaa...");
System.out.println(result); //反射静态方法
Method eat = clazz.getMethod("eat", null);
eat.invoke(null, null); //null }
}

运行结果:

run1...
run2....
run3....
say..
aaa...
eat...

java反射学习笔记的更多相关文章

  1. Java 反射学习笔记

    要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...

  2. java 反射---学习笔记

    一.java的动态性 反射机制 动态编译 动态执行JavaScript代码 动态字节码操作 二.动态语言 动态语言 程序运行时,可以改变程序结构或变量类型,典型的语言:python.ruby.java ...

  3. [新手学Java]反射学习笔记

    示例类 @SuppressWarnings("unused") public class Person { public String Name; private int Age; ...

  4. Java反射学习笔记01

  5. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  7. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  8. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. java JDK8 学习笔记——助教学习博客汇总

    java JDK8 学习笔记——助教学习博客汇总 1-6章 (by肖昱) Java学习笔记第一章——Java平台概论 Java学习笔记第二章——从JDK到IDEJava学习笔记第三章——基础语法Jav ...

随机推荐

  1. linux 安装 ftp

    1 安装 vsftpd 查看是否已经安装 vsftpd rpm -qa | grep vsftpd 如果没有 则安装  安装命令如下 yum -y install vsftpd 设置开机启动 chkc ...

  2. PostgreSQL 列出所有表名和数据库名

    列出表名   直接 \d 不加参数 或 SELECT   tablename   FROM   pg_tables   WHERE   tablename   NOT   LIKE   'pg%'   ...

  3. iOS开发UI篇—无限轮播(循环利用)

    iOS开发UI篇—无限轮播(循环利用) 一.无限轮播  1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...

  4. Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结

    一.前言 昨天更新了10天前上架到windows8.1平台和windowsphone平台的通用应用“51单片机汇编”,总要是添加了动态磁贴以及ListView的Groupstyle应用.下面主要主要复 ...

  5. CodeForces 686B-Little Robber Girl's Zoo

    题目: 有n头数量的动物,开始它们站在一排,它们之间有高度差,所以需要将它们进行交换使得最终形成一个不减的序列,求它们交换的区间.交换的规则:一段区间[l, r]将l与l+1.l+2与l+3..... ...

  6. Servlet路径跳转2--在servlet当中,跳转到某网页时的路径写法

    课程1-13   http://www.imooc.com/video/5554 Servlet路径跳转: 绝对路径:放在任何地方都对的路径 相对路径:相对于当前资源的路径 两种方法:请求重定向,服务 ...

  7. BaiduMap Search List

    using AnfleCrawler.Common; using HtmlClient; using System; using System.Collections.Generic; using S ...

  8. Android常见控件— — —EditText

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  9. javascript之DOM篇一

    一.什么是DOM DOM是用来操作页面,如div的获取,修改样式 二.DOM节点 标签(css)=元素(js)=节点(DOM) 1.子节点 childNodes 仅算父元素下的第一层 <!DOC ...

  10. SqlServer性能优化(一)

    一:数据存储的方式: 1.数据文件:.mdf或.ndf 2.日志文件:.ldf 二:事务日志的工作步骤: 1.数据修改由应用程序发出(在缓冲区进行缓存) 2.数据页位于缓存区缓冲中,或者读入缓冲区缓存 ...