Day18 (二)反射
反射机制是什么
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射机制能做什么
反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
反射机制的优点与缺点
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多
态的应用,有以降低类之间的藕合性。
一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中
它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编
译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如
这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能
的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功
能。
它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它
满足我们的要求。这类操作总是慢于只直接执行相同的操作。
反射的应用
package day18; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays; class Student{
private int no;
public String name; public Student() {
System.out.println("无参构造");
}
public Student(int no, String name) {
this.no = no;
this.name = name;
System.out.println("带参构造:"+no+","+name);
}
public void f1() {
System.out.println("无参无返回值得方法f1");
}
public String f2(String s,int n) {
return "串"+s+":"+n;
}
}
public class TestClass1 { public static void main(String[] args) throws Exception {
// Class反射
//运行 期 获得类中的信息
//先获得 字节码文件的对象
Class<?> c = Class.forName("day18.Student");
// Class<Student> c = Student.class;
// Class<? extends Student> c = new Student().getClass();
//属性----------------------------------------------------------
System.out.println("-------------------属性 ----------------------");
// Field [] fs = c.getFields();//public
Field [] fs = c.getDeclaredFields();//所有属性
for(Field f: fs) {
System.out.println(f.getName());
System.out.println(f.getType());
System.out.println(Modifier.toString(f.getModifiers()));
}
Field f1 = c.getDeclaredField("name");
Object obj = c.newInstance();//调用构造
f1.set(obj, "Tom");
System.out.println(f1.get(obj)); Field f2 = c.getDeclaredField("no");
f2.setAccessible(true);//设置允许访问权限
f2.set(obj, );
System.out.println(f2.get(obj)); //方法----------------------------------------------------------------
System.out.println("------------------方法--------------------------");
Method [] ms = c.getDeclaredMethods();
for(Method m :ms) {
System.out.println(m.getName());
System.out.println(m.getReturnType());
System.out.println(Arrays.toString(m.getParameterTypes()));
}
Method m1 = c.getDeclaredMethod("f1");
m1.invoke(obj);
Method m2 = c.getDeclaredMethod("f2", String.class,int.class);
System.out.println(m2.invoke(obj, "hello",));
//构造--------------------------------------------------------------
System.out.println("-------------------构造--------------------------------");
Constructor<?> [] crs = c.getDeclaredConstructors();
for(Constructor cr :crs) {
System.out.println(cr.getName());
System.out.println(Arrays.toString(cr.getParameterTypes()));
}
Constructor cr1 = c.getDeclaredConstructor();
cr1.newInstance();
Constructor cr2 = c.getDeclaredConstructor(int.class,String.class);
cr2.newInstance(,"郭靖"); } }
Day18 (二)反射的更多相关文章
- java反射(二)--反射应用案例
一.反射实例化对象 经过一系列的分析之后发现虽然可以获取Class类的实例化对象,但是依然觉得这个对象的获取意义不是很大,因此可以通过以下几个案例去理解反射的核心意义--反射实例化对象:获取Class ...
- spring(二)-反射、动态代理
主要是对上一篇文章中涉及到的点做补充,欢迎指正! 1. java反射知识-Spring IOC 依赖注入 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个 ...
- JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践
JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识 ...
- Java反射机制及IoC原理
一. 反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.在java中,只要给定类的名字, 那么就可以通 ...
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
- JAVA的反射机制原理
http://www.cnblogs.com/hongxinlaoking/p/4684652.html 一 反射机制的概念: 指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于 ...
- Python之路- 反射&定制自己的数据类型
一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super ...
- Java反射总结
一. 获取Class对象的3种方法: 1. Class.forName("");例如:Class.forName("java.lang.String"); 2. ...
- 第六节:反射(几种写法、好处和弊端、利用反射实现IOC)
一. 加载dll,读取相关信息 1. 加载程序集的三种方式 调用Assembly类下的三个方法:Load.LoadFile.LoadFrom. //1.1 Load方法:动态默认加载当前路径下的(bi ...
- C# 反射机制以及方法
目录: 一. 反射的主要特性 1.反射中一个非常重要的类型就是 Type 1)当没有对象的时候使用这种方式来获取某个类型的Type 2)当已经获得对象后通过对象的GetType()方法来获取指定对象的 ...
随机推荐
- Docx4j将html转成word时,br标签为软回车的问题修改
docx4j版本:3.0.1 修改jar包:docx4j-ImportXHTML maven配置为: 具体代码位置:\org\docx4j\convert\in\xhtml\XHTMLImporter ...
- UVA11624(KB1-J)
Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of ...
- 爬虫必备—Scrapy
一.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 ...
- CSS之浮动布局(float,浮动原理,清除/闭合浮动方法)
css之浮动布局 本人博客:查看文章 1.什么是浮动:在我们布局的时用到的一种技术,能够方便我们进行布局,通过让元素浮动,我们可以使元素在水平上左右移动,再通过margin属性调整位置 2.浮动的 ...
- <Android 基础(二十八)> Fragment (1)
简介 Fragment,碎片,常用的内容,但是一直没有系统的学习下它的使用方法,花几天抽空看看随便记录一下. 生命周期 来自官网的图片一目了然. 自测试结果: 基本使用 1.自定义一个Fragment ...
- Difference between model.evaluate vs model.predict in Keras
The model.evaluate function predicts the output for the given input and then computes the metrics ...
- 进度条(Progressbar)
进度条(Progressbar) 提供如下一些样式改变进度条的外观 @android:style/Widget.ProgressBar.Horizontal(水平进度条) @android:style ...
- text-overflow修剪文本,以省略号显示
overflow: hidden; 必须设置,不然无法修剪文本 white-space: nowrap; 规定段落中的文本不进行换行 text-overflow: ellipsis; 当文本溢出 ...
- Android保持屏幕常亮
Android保持屏幕常亮,PowerManager.WakeLock的使用 package com.hebaijun.wakelock; import android.app.Activi ...
- Tomcat性能监控之Probe
目前采用java进行开发的系统居多,这些系统运行在java容器中,通过对容器的监控可以了解到java进程的运行状况,分析java程序问题.目前市面上流行的中间件有很多(Tomcat.jetty.jbo ...