Java API VIII
Java API VIII
java反射机制
1. 反射
反射是java中的动态机制,它允许我们在程序运行期间再确定类的实例化,方法的调用,属性的调用等,而不是传统意义上的在编码期间确定。
因此,反射可以大大的提高代码的灵活度,但是随之而来的是更多的系统开销和较慢的运行速度,因此不能过度的依赖反射。
Class类
Class的每一个实例用于表示JVM加载的一个类,所以我们也称Class的实例
为类的类对象。
当JVM加载一个类时会同时实例化一个Class的实例与之对应,这个Class实例
中会保存该类的一切信息(类名,有哪些方法,构造器,属性,注解等等)
我们在程序运行期间通过某个类的类对象来操作这个类。因此使用反射操作某个
类的第一件事就是获取该类的类对象
2. 获取一个类的类对象有三种方式:
1:类名.class
例如:
Class cls = String.class;
Class cls = int.class (基本类型只能通过这种方式获取类对象)2:Class.forName(String className)
通过Class的静态方法forName,传入对应类的完全限定名(包名.类名)的
形式获取类对象
Class cls = Class.forName(“java.lang.String”);3:通过类加载器ClassLoader加载类对象
package reflect;import java.lang.reflect.Method;/*** java反射机制* 反射是java中的动态机制,它允许我们在程序运行期间再确定类的实例化,方法的调用,* 属性的调用等,而不是传统意义上的在编码期间确定。** 因此,反射可以大大的提高代码的灵活度,但是随之而来的是更多的系统开销和较慢的* 运行速度,因此不能过度的依赖反射。*/
public class ReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {/*Class类Class的每一个实例用于表示JVM加载的一个类,所以我们也称Class的实例为类的类对象。当JVM加载一个类时会同时实例化一个Class的实例与之对应,这个Class实例中会保存该类的一切信息(类名,有哪些方法,构造器,属性,注解等等)我们在程序运行期间通过某个类的类对象来操作这个类。因此使用反射操作某个类的第一件事就是获取该类的类对象获取一个类的类对象有三种方式:1:类名.class例如:Class cls = String.class;Class cls = int.class (基本类型只能通过这种方式获取类对象)2:Class.forName(String className)通过Class的静态方法forName,传入对应类的完全限定名(包名.类名)的形式获取类对象Class cls = Class.forName("java.lang.String");3:通过类加载器ClassLoader加载类对象*///获取String的类对象
// Class cls = String.class;/*Class.forName()该方法要求必须处理异常:ClassNotFoundException当指定的字符串(对应类的完全限定名)有误时会抛出该异常,或指定的路径下无法找到该类时也会抛出该异常(多发生于通过反射加载第三方jar文件里的类,有时我们忘记将该jar导入环境变量中,导致JVM无法通过正确的包路径找到它)。*/
// Class cls = Class.forName("java.lang.String");/*类加载器ClassLoader类加载器有很多中不同的实现,创建方式也各不相同。最常用的是如下方式:ClassLoader loader = 当前类.class.getClassLoader();类加载器除了可以加载类对象,还可以做很多和环境变量相关的操作,功能多。*/ClassLoader classLoader = ReflectDemo1.class.getClassLoader();Class cls = classLoader.loadClass("java.lang.String");//查看类名//获取类的完全限定名(包名.类名)String className = cls.getName();System.out.println("类名:"+className);//仅获取类名className = cls.getSimpleName();System.out.println("类名:"+className);//通过类对象获取其表示的类的所有方法//获取所有公开方法和从超类继承的方法
// Method[] methods = cls.getMethods();
// for(Method method : methods){// System.out.println(method.getName());
// }//获取本类定义的方法(包含私有方法,但是不含有从超类继承的方法)Method[] methods = cls.getDeclaredMethods();for(Method method : methods){System.out.println(method.getName());}}
}
3. 使用反射机制进行对象的实例化
Class提供的方法:
Object newInstance()
该方法可以使用其表示的类的无参构造器进行对象实例化
package reflect;/*** 使用反射机制进行对象的实例化*/
public class ReflectDemo2 {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {Person p = new Person();//硬编码,编码期间确定实例化那个类System.out.println(p);/*使用反射机制实例化1:获取要实例化类的类对象2:通过类对象的newInstance方法实例化*///1加载类对象
// Class cls = Class.forName("reflect.Person");ClassLoader classLoader = ReflectDemo2.class.getClassLoader();Class cls = classLoader.loadClass("reflect.Person");//2通过类对象实例化Object o = cls.newInstance();//调用无参构造器System.out.println(o);}
}
使用有参构造器实例化对象
package reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;/*** 使用有参构造器实例化对象*/
public class ReflectDemo3 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {Person p = new Person("刘苍松",55);System.out.println(p);//加载类对象Class cls = Class.forName("reflect.Person");//获取无参构造器
// Constructor c = cls.getConstructor();
// Object o = c.newInstance();//先获取指定的构造器:Person(String name,int age)Constructor c = cls.getConstructor(String.class,int.class);Object o = c.newInstance("刘苍松",55);System.out.println(o);}
}
使用反射机制调用方法
调用无参数方法:
package reflect;import java.lang.reflect.Method;
import java.util.Scanner;/*** 使用反射机制调用方法*/
public class ReflectDemo4 {public static void main(String[] args) throws Exception {Person p = new Person();p.sayHello();Scanner scanner = new Scanner(System.in);System.out.println("请输入类名:");String className = scanner.nextLine();System.out.println("请输入方法名:");String methodName = scanner.nextLine();//实例化ClassLoader classLoader = ReflectDemo4.class.getClassLoader();
// Class cls = classLoader.loadClass("reflect.Person");Class cls = classLoader.loadClass(className);Object o = cls.newInstance();//new Person()//调用方法//1通过类对象获取要调用的方法
// Method method = cls.getMethod("sayHello");//获取无参方法sayHelloMethod method = cls.getMethod(methodName);//2通过方法对象执行该方法method.invoke(o);//o.sayHello() o实际上是一个Person对象}
}
调用有参方法:
package reflect;import java.lang.reflect.Method;/*** 调用有参方法*/
public class ReflectDemo5 {public static void main(String[] args) throws Exception {Class cls = Class.forName("reflect.Person");Object o = cls.newInstance();//say(String info)Method m = cls.getMethod("say",String.class);m.invoke(o,"hello~~");//p.say("hello~~")//say(String info,int sum)Method m2 = cls.getMethod("say",String.class,int.class);m2.invoke(o,"嘿嘿",5);}
}
访问私有方法:
package reflect;import java.lang.reflect.Method;/*** 使用反射机制调用私有方法*/
public class ReflectDemo6 {public static void main(String[] args) throws Exception {Person p = new Person();
// p.hehe();//编译不通过!Class cls = Class.forName("reflect.Person");Object o = cls.newInstance();//获取私有方法:private void hehe()
// Method m = cls.getMethod("hehe");//获取私有方法不能用getMethod,(这用来获取公开方法)Method m = cls.getDeclaredMethod("hehe");m.setAccessible(true);//强制访问m.invoke(o);//o.hehe()}
}
我是将军;我一直都在,。!
Java API VIII相关推荐
- 2021年大数据Kafka(五):❤️Kafka的java API编写❤️
全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Kafka的java API编写 一.生产者代码 第一步: ...
- 2021年大数据ZooKeeper(五):ZooKeeper Java API操作
目录 ZooKeeper Java API操作 引入maven坐标 节点的操作 ZooKeeper Java API操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端 ...
- 随机森林 java_机器学习weka,java api调用随机森林及保存模型
工作需要,了解了一下weka的java api,主要是随机森林这一块,刚开始学习,记录下. 了解不多,直接上demo,里面有一些注释说明: package weka; import java.io.F ...
- 【ZooKeeper Notes 3】ZooKeeper Java API 使用样例
查看PDF版本 转载请注明:@ni掌柜 nileader@gmail.com ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务框架,包含一组简单的原语集合.通过这些原语言的组合使用, ...
- Kafka系列三 java API操作
使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
- java代码操作git_JGit--实现Git命令操作的Java API
问题来源:最近在做一个项目,其中有一块需要用户上传代码到服务器中,然后分析用户所传的代码,传代码最直接的方式就是用户打个包上传,但是后期再分析代码的时候还要代码实现解压上传的代码,操作起来比较复杂. ...
- java api 设计_Java API设计实践
使你的API在模块化和非模块化Java环境中都可用 在优锐课的java学习分享中,对微服务有了更深层次的新概念.关于API设计实践一点就通了. 介绍 了解设计Java API时应应用的一些API设计实 ...
- hbase建索引java api_hbase java api样例(版本1.3.1,新API)
hbase版本:1.3.1 目的:HBase新API的使用方法. 尝试并验证了如下几种java api的使用方法. 1.创建表 2.创建表(预分区) 3.单条插入 4.批量插入 5.批量插入(客户端缓 ...
- MyBatis——Java API
Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDB ...
最新文章
- 逃课上网吧编程、玩摇滚的另类学生,如何成为独角兽公司的 CTO?
- Struts+Spring+Hibernate整合入门详解
- struts1.x心得1--struts入门介绍
- Chapter7-10_Deep Learning for Question Answering (1/2)
- 反汇编基础-寄存器及内存
- 【硬核科技】转行AI,从零出发
- 深度学习基础 | NLP大魔王 · BERT
- Struts2 中继承ActionSupport类
- Windows 之 IP地址
- package.json文件指南
- unittest之TestResult类详解
- Xcode 6 console
- [SHOI2017]期末考试
- 我是主考官__博文(作者著有《Java程序员,上班那点事儿》)
- 计算广告概述【计算广告】
- ARM开发板使用GDB调试程序
- 有n堆石子,每次取出两堆合成一堆,每堆石子的个数即为合并石子所需要耗费的体力,求出合并所有石子堆所需要耗费的最小体力
- 【工业4.0系列谈之五】建设智能工厂 可从这6个方面着手
- Unity3D 录音功能 音频保存
- 施工企业物资管理软件
热门文章
- 无法创建链接服务器 ORCL 的 OLE DB 访问接口 OraOLEDB.Oracle 的实例 (错误:7302)...
- random是python的第三方库吗_random库是Python的()
- webstorm安装eslint插件_在WebStorm中使用ESLint开发Vue项目 | 六阿哥博客
- Java实现神经网络方法
- opencv去除图片水印
- clicktorun 离线_Project 2016 和 Visio 2016 的 Office Click-to-Run 永久(C2R P)版本
- 安卓基础学习 Day19|安卓高级控件------下拉列表
- vmware您无权输入许可证密钥,请请使用系统管理员账户重试
- 计算机服务 无法保存,无法保存打印机设置0x000006d9怎么办实测解决
- 自然语言14_Stemming words with NLTK