Java编程基础-反射

一、java反射

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

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

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

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

[java] view plain copy

  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类

[java] view plain copy

  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

[java] view plain copy

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

1、获得属性:

[java] view plain copy

  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、获得方法:

[java] view plain copy

  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,查看效果。

[java] view plain copy

  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、获得其他:

[java] view plain copy

  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、通过反射实例化对象,调用对象方法

[java] view plain copy

  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

时间: 2024-10-12 09:25:05

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

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

本章承接Java编程基础-面向对象(上)一文. 一.static关键字 在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量.成员方法以及代码块等,被static修饰的成员具备一些特性. 1.static关键字的特点: a)随着类的加载而加载,也就是说,静态会随着类的消失而消失,说明它的生命周期最长. b)优先于对象存在,明确一点,静态是先存在的,对象是后存在的. c)被类的所有对象共享. d)可以通过类名调用. 2.静态变量 在一个java类中,可以使用static关键字

Java大神推荐,java编程基础必备(必看)

在没有以前的操作习惯的错误情况下,反而容易接受新知识,所以不要因为自己对java一无所知而自卑,相反,这是菜鸟们的优势,但是如何才能从一个菜鸟历练成大神呢,当然是需要学习了,不学习就想成为大神,就是在做白日梦,所以如果你想改变自己,那么你可以来我们这个交流群来学习521595826,在这里每天都能学到新鲜的知识,想不进步都难,但是如果你是一个不思进取的人,一边凉快去就行.下面来介绍下java编程基础必备知识: 第一步:下载并安装JDK 6.0,安装路径为: C:\java\jdk1.6 . 第二

Java面试求职之Java编程基础

Java编程基础 小编目前大三在读,专业电子系.由于对编程感兴趣还有就是对本专业前途的不乐观,还是勇敢的加入所谓的码农之路.学习Java也有一段时间了,快要放假了,想找家公司实习一下.至目前为止,已经面试了好几家公司了,大的有像腾讯.百度.联想这样的大公司:小的也有只有10几个员工的创业型公司.拿到过offer.也有碰壁连面试机会都没得到的. 下面就是一些对面试官面试时问的问题做的一些总结和自己搜集的一些知识点. Java概述和开发环境 Java开发包的总类            随着Java语

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

Java入门--(1)Java编程基础 第二章 Java编程基础 JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 } 2.1关键字:赋予了特殊含义的单词. 2.2标识符:在程序中定义的一些名称. 比如:类名 a-z 0-9 _ $ 数字不可以开头,不可以使用关键字,一般首字母大写. 2.3注释:注解说明程序的文字. 作用:1.对程序进行说明. 2.调试程序. 注意:多行注释可嵌单行注释,但不能嵌套多行注释. /*多行注释*/ /**文档注释*/ //单行注释 /* 需求:写一个

java编程基础(一)

Java编程基础(一) 1. java基本语法 1.1 Java基本格式 修饰符 class 类名 { 程序代码 } Java严格区分大小写,例如不能将class关键字写成Class, java编译器将不能识别. Java程序中连续的字符串不能分行写:如果想分行写,可以写成两个字符串,中间用+号连接即可. 每一语句以分号结尾. 1.2 java注释 1.2.1 功能: 增加代码可读性,方便阅读,它只在源文件中有效,编译时编译器会忽略这些信息,不会将其编译到class文件中. 1.2.2 分类 注

java 编程基础

临近毕业,准备复习一些java的基础,顺便整理一下知识 编程基础 1.Java的特性和优势:简单.面向对象可移植( write once ,run anywhere ).高性能 ,分布式.动态性多线程安全健壮. 2.Java的运行机制, 计算高级编程语言类型有:编译型.解释型. Java语言是这两种类型的结合,利用编辑器写 Java源程序 -- 源文件名 :主类名.java,利用编译器(javac )将源程序编译 成字节码 -- 字节码文件名 :源文件名.class,再利用虚拟机 (解释器,即

Java编程之反射中的注解详解

"注解"这个词,可谓是在Java编程中出镜率比较高,而且也是一个老生常谈的话题.我们之前在聊Spring相关的东西时,注解是无处不在,之前我们简单的聊过一些"注解"的相关内容,比如在Spring中是如何进行"注解"组合的.因为注解在Java编程中还是比较重要的,所以我们今天的博客就把注解的东西给系统的介绍一下,当然我们会依托于具体的实例. "注解"说白了就是存储数据的一种方式,如果注解单拎出来功能也就一般,如果将"注

黑马程序员——01.Java编程基础(一) ——常量、变量、运算符

一.Java的基础组成 1.关键字--被赋予特殊含义的单词 ????????????学习Java的过程中去记忆. 2.标识符---就是指名称(类名.对象名.变量名.函数名.对象名等) ? ? ? ?????????1.26?个英文字母的大小写.0~9数字._和$(不允许有空格) ? ? ? ? ????????2.数字不能开头,关键字不能用来命名 ? ? ? ?????????3.类名-首字母大写(XxxYyyZzz);函数名-(xxxYyyZzz);变量名对象名(xxxyyyzzz) (1)和

01.Java编程基础(一) ——常量、变量、运算符

一.Java的基础组成 1.关键字--被赋予特殊含义的单词 ????????????学习Java的过程中去记忆. 2.标识符---就是指名称(类名.对象名.变量名.函数名.对象名等) ? ? ? ?????????1.26?个英文字母的大小写.0~9数字._和$(不允许有空格) ? ? ? ? ????????2.数字不能开头,关键字不能用来命名 ? ? ? ?????????3.类名-首字母大写(XxxYyyZzz);函数名-(xxxYyyZzz);变量名对象名(xxxyyyzzz) (1)和