一、java反射

1、反射:动态获取类的信息,以及动态调用对象的方法的功能。可以理解为动态看透类的能力。

2、主要功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

通过Java反射机制,可以在程序中访问已经装载到JVM中的java对象的描述,实现访问、检测和修改描述java对象本身信息的功能。java反射机制的功能十分强大,java.lang.reflect包中提供了对该功能的支持。

二、通过反射获取类的三种方法

  1. //1、第一种方式-->Class.forName("类名字符串");
  2. //注:类名字符串是"包名+类名" 返回Class的对象。(这种是最常用的方法)
  3. Class c1=Class.forName("csdn.Student");
  4. //2、第二种方式-->先创建对象,再用对象调用getClass()方法,即实例对象.getClass().返回运行时类。
  5. //任何一个java对象都有getClass()方法
  6. Student s=new Student();
  7. Class c2 = s.getClass();
  8. //3、第三种方式-->类名.class。返回Class的对象。(每个类都有class属性)
  9. Class c3=Student.class;

三、通过反射可以获取到的主要描述信息

  1. package csdn;
  2. public class Person {
  3. public String name;// 姓名
  4. public int age;// 年龄
  5. public Person() {
  6. super();
  7. }
  8. public Person(String name, int age) {
  9. super();
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public String showInfo() {
  14. return "name=" + name + ", age=" + age;
  15. }
  16. }

子类:Student类

  1. package csdn;
  2. public class Student extends Person implements Study {
  3. public String className;// 班级
  4. private String address;// 住址
  5. public Student() {
  6. super();
  7. }
  8. public Student(String name, int age, String className, String address) {
  9. super(name, age);
  10. this.className = className;
  11. this.address = address;
  12. }
  13. public Student(String className) {
  14. this.className = className;
  15. }
  16. public String toString() {
  17. return "姓名:" + name + ",年龄:" + age + ",班级:" + className + ",住址:"
  18. + address;
  19. }
  20. public String getAddress() {
  21. return address;
  22. }
  23. public void setAddress(String address) {
  24. this.address = address;
  25. }
  26. }

接口:study

  1. package csdn;
  2. public interface Study {
  3. //仅为了演示获得接口,就没有写抽象方法
  4. }

1、获得属性:

  1. Class stu = Class.forName("csdn.Student");
  2. // 获取对象的所有公有属性。
  3. Field[] fields = stu.getFields();
  4. for (Field f : fields) {
  5. System.out.println(f);
  6. }
  7. System.out.println("---------------------");
  8. // 获取对象所有属性,但不包含继承的。
  9. Field[] declaredFields = stu.getDeclaredFields();
  10. for (Field ff : declaredFields) {
  11. System.out.println(ff);
  12. }

运行结果:

public java.lang.String csdn.Student.className
public java.lang.String csdn.Person.name
public int csdn.Person.age
---------------------
public java.lang.String csdn.Student.className
private java.lang.String csdn.Student.address
2、获得方法:
  1. Class stu = Class.forName("csdn.Student");
  2. // 获取对象的所有公共方法
  3. Method[] methods = stu.getMethods();
  4. for (Method m : methods) {
  5. System.out.println(m);
  6. }
  7. System.out.println("---------------------");
  8. // 获取对象所有方法,但不包含继承的
  9. Method[] declaredMethods = stu.getDeclaredMethods();
  10. for (Method ms : declaredMethods) {
  11. System.out.println(ms);
  12. }

运行结果:

public java.lang.String csdn.Student.toString()
public java.lang.String csdn.Student.getAddress()
public void csdn.Student.setAddress(java.lang.String)
public java.lang.String csdn.Person.showInfo()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
---------------------
public java.lang.String csdn.Student.toString()
public java.lang.String csdn.Student.getAddress()
public void csdn.Student.setAddress(java.lang.String)

3、获得构造方法:

为了演示区别,将Student类中参数为className的构造方法的public修饰符改为protected,查看效果。
  1. Class stu = Class.forName("csdn.Student");
  2. // 获取对象所有的公共构造方法
  3. Constructor[] constructors = stu.getConstructors();
  4. for (Constructor c : constructors) {
  5. System.out.println(c);
  6. }
  7. System.out.println("---------------------");
  8. // 获取对象所有的构造方法
  9. Constructor[] declaredConstructors = stu.getDeclaredConstructors();
  10. for (Constructor con : declaredConstructors) {
  11. System.out.println(con);
  12. }

运行结果为:

public csdn.Student(java.lang.String,int,java.lang.String,java.lang.String)
public csdn.Student()
---------------------
protected csdn.Student(java.lang.String)
public csdn.Student(java.lang.String,int,java.lang.String,java.lang.String)
public csdn.Student()

4、获得其他:

  1. Class stu = Class.forName("csdn.Student");
  2. System.out.println(stu.getName());//获取对象全限定名称
  3. System.out.println(stu.getPackage());// 获取包名
  4. Class[] interfaces = stu.getInterfaces();//获取该类实现的所有接口
  5. for(Class in:interfaces){
  6. System.out.println(in);
  7. }

运行结果为:
csdn.Student
package csdn
interface csdn.Study

5、通过反射实例化对象,调用对象方法
  1. package csdn;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Method;
  4. public class TestReflect {
  5. @SuppressWarnings("unchecked")
  6. public static void main(String[] args)  {
  7. try {
  8. Class c = Class.forName("csdn.Student");
  9. Student stu = (Student) c.newInstance();
  10. // 第一种方法,实例化默认构造方法,调用set赋值
  11. stu.setAddress("深圳南山");
  12. System.out.println(stu);
  13. // 第二种方法 取得全部的构造函数 使用构造函数赋值
  14. Constructor<Student> constructor = c.getConstructor(String.class,
  15. int.class, String.class, String.class);
  16. Student s = (Student) constructor.newInstance("李四", 18, "七班", "深圳");
  17. System.out.println(s);
  18. Method show = c.getMethod("showInfo");//获取showInfo()方法
  19. System.out.println(show.invoke(s));//调用showInfo()方法
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }<span style="color:#3333ff;"><strong>
  25. </strong></span>

运行结果为:

姓名:null,年龄:0,班级:null,住址:深圳南山
姓名:李四,年龄:18,班级:七班,住址:深圳
name=李四, age=18

Java编程基础-反射的更多相关文章

  1. java 编程基础 反射方式获取泛型的类型Fileld.getGenericType() 或Method.getGenericParameterTypes(); (ParameterizedType) ;getActualTypeArguments()

    引言 自从JDK5以后,Java Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如,String.class的类型实际上是 Class 如果 Class 对应的类暂时未知,则使 C ...

  2. Java入门——(1)Java编程基础

    Java入门--(1)Java编程基础 第二章 Java编程基础   JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 }   2.1关键字:赋予了特殊含义的单词.   2.2标识符: ...

  3. Java开发知识之Java编程基础

    Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...

  4. Java 高级基础——反射

    Java 高级基础--反射 反射的意义:Java 强类型语言,但是我们在运行时有了解.修改信息的需求,包括类信息.成员信息以及数组信息. 基本类型与引用类型 基本类型,(固定的 8 种) 整数:byt ...

  5. java编程基础二进制

    0.java编程基础 01.二进制(原码,反码,补码) 02.位运算 03.移位运算符 二进制 原码,反码,补码 1.基本概念 二进制是逢2进位的进位制,0,1是基本算符. 现在的电子计算机技术全部使 ...

  6. Java编程基础-面向对象(中)

    本章承接Java编程基础-面向对象(上)一文. 一.static关键字 在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量.成员方法以及代码块等,被static修饰的成员具备一 ...

  7. Java编程基础——数组和二维数组

    Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...

  8. Java编程基础——流程控制

    Java编程基础——流程控制 摘要:本文主要介绍Java编程中的流程控制语句. 分类 流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下三种: 顺序结构:从上到下依次执行每条语句操作 ...

  9. Java编程基础——运算符和进制

    Java编程基础——运算符和进制 摘要:本文主要介绍运算符和进制的基本知识. 说明 分类 Java语言支持如下运算符: ◆ 算术运算符:++,--,+,-,*,/,%. ◆ 赋值运算符:=,+=,-= ...

随机推荐

  1. 条件变量pthread_cond_wait()和pthread_cond_signal()详解

    条件变量        条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立" ...

  2. mtk lk阶段的lcm流程

    一.lk进入kmain() 1. vendor/mediatek/proprietary/bootable/bootloader/lk/arch/arm/srt0.S bl kmain 二.初始化lk ...

  3. Strom配置说明

    在进群生产环境下运行Topology和在本地模式下运行非常相似.下面是步骤: 1.定义Topology(如果使用Java开发语言,则使用TopologyBuilder来创建) 2.使用StormSub ...

  4. spark运行模式之一:Spark的local模式安装部署

    Spark运行模式 Spark 有很多种模式,最简单就是单机本地模式,还有单机伪分布式模式,复杂的则运行在集群中,目前能很好的运行在 Yarn和 Mesos 中,当然 Spark 还有自带的 Stan ...

  5. saltstack api安装使用

    Salt自然也是提供api的,使用api对自动化有极大的帮助,我们使用rest风格的api,当然大家都知道salt是python写的,那么自然也就提供了对应的api,但是并不建议使用,因为调用pyth ...

  6. python_学习笔记

    1,多态:对不同类的对象使用同样的操作,但使用函数显示地检查类型能够毁掉多态(eg: type,isinstance,issubclass) 封装:多态让用户对于不知道是什么类的对象进行方法调用,而封 ...

  7. [hdu2457]DNA repair(AC自动机+dp)

    题意:给出一些不合法的模式DNA串,给出一个原串,问最少需要修改多少个字符,使得原串中不包含非法串. 解题关键:多模式串匹配->AC自动机,求最优值->dp,注意在AC自动机上dp的套路. ...

  8. HDOJ-1412(set)

    {A} + {B} Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. 第一篇:构建第一个SpringBoot工程

    简介 spring boot 它的设计目的就是为例简化开发,开启了各种自动装配,你不想写各种配置文件,引入相关的依赖就能迅速搭建起一个web工程.它采用的是建立生产就绪的应用程序观点,优先于配置的惯例 ...

  10. 3-C++程序的结构1.4

    共享数据的保护 对于既需要共享.又需要防止改变的数据应该声明为常量. 1.常引用 如果在声明引用时用const修饰,被声明的引用就是常引用.常引用所引用的对象不能被更新.声明形式如下: const 类 ...