初识Java反射

来源:互联网 发布:高清网络监控 编辑:程序博客网 时间:2024/06/05 02:49

今天上课一个老师问:一个引用指向一个对象能不能使用这个对象里面的所有公用方法,同学都一一回答可以,结果测试之后都错了。先举个列子吧。

1. 实体类测试类学生

package com.test.entity;public class Student {private String name;public void Singing(){System.out.println("sing a song");}public String getName() {return name;}public void setName(String name) {this.name = name;}}
2.测试代码:

import com.test.entity.Student;public class FeflectTest {public static void main(String[] args) {/* * 用一个object的引用去指向一个学生; * */Object s = new Student();//s.Singing();}}
结果注释的地方编译就报错,没有此方法。然后就顺势分析问题,那到底s是Object类型还是Student类型呢。初看应该是Object类型,因为s.Singing()报错嘛。然而答案真是这样吗?

在测试代码中运行代码System.out.println(s.getClass().getName());结构输出com.test.entity.Student。所以理解是错误的,其实s是能执行此方法的,只是在编译器无法成功通过编译。那么怎样才能让s执行方法呢?接下来就要讲到Java中的反射了。

一. java反射机制

.class----->.java 是一个编译的逆过程

通过java反射能访问java的方法,属性,接口等等

二.Class 讲解

java世界里,一切皆对象。各个java对象也是对象,是Class。这个其实就是我们.java文件编译后的.class那个东西,通常较字节码,是java反射中的核心。

获取对象的字节码方式如下:

//第一种方式:  Classc = Class.forName("com.test.entity.Student");  //第二种方式:  //java中每个类型都有class 属性.  Classc1 = Student.class;     //第三种方式:  //java语言中任何一个java对象都有getClass 方法  Student= new Student();  Classc2 = e.getClass();
获取对象的字节码之后就能进行java反射了。

三 通过java反射动态调用方法

java作为先编译后运行的语言,java反射机制能让我们更完全的操作java对象,通过得到的class就能获取对象的属性、方法、构造方法、父类、接口等等。在这里就不赘述了,api讲的非常详细。

import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import com.test.entity.Student;public class FeflectTest {public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {/* * 用一个object的引用去指向一个学生; * */Object s = new Student();Class cs = s.getClass();//获取学生类的classMethod Singing = cs.getMethod("Singing", null);//获取方法,第一个参数为方法名,第二个为方法的参数,是个数组Singing.invoke(s, null);//对应方法的调用,第一个参数为作用的类对象,第二个为方法传递的参数 output:sing a song//s.Singing();}}
通过上述代码就能实现一开的需求,绕过编译器动态调用Singing()方法。





10 5
原创粉丝点击