Java反射机制简单学习
java中除了基本数据类型,几乎都为对象。例如
Person p=new Person(); 这句语句表明了p是Person类的一个实例对象。但其实,Person也是一个实例对象,它是Class类的实例对象(java.lang.Class)。
Person的实例对象是通过new来获取的,但是Class的实例对象我们却不能这样new出来,因为通过源码我们会发现Class的构造方法是已经私有化了。
如果我们要获取Class的实例对象(即官方中的类类型,后文将用以区分普通的实例对象),有三种方式。
1.通过类.class来获取
package reflect; public class Demo1 {
public static void main(String[] args) {
Person person = new Person();
Class p=Person.class;
}
} class Person{ }
2.通过对象的getClass方法来获取
package reflect; public class Demo1 {
public static void main(String[] args) {
Person person = new Person();
Class p=person.getClass();
}
} class Person{ }
3.通过动态加载(后文有作解释何为动态加载)
package reflect; public class Demo1 {
public static void main(String[] args) {
try {
Class p=Class.forName("reflect.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} class Person{ }
总共三种方式可以获取Class的实例对象p,这个p就称之为Person的类类型。
动态加载和静态加载:
普通的利用构建方法new的方式称之为静态加载,而通过Class.forName(String name)的方法找到其类类型,再new Instance方式创建其对象的
方式称之为动态加载。
区别:静态加载时发生在编译时,就是编译过程中会去创建对象,如果发现问题会报错。而动态加载则是在运行过程中才会去加载,并才会去发现错误。
好处就是,动态加载能够在不改变原有的情况下,增加新的功能。
例如:
静态加载:
package reflect; /**
* 静态加载
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
Person1 p=new Person1(); //报错 编译报错 }
}
动态加载:
package reflect; /**
* 动态加载
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
Class clazz=Class.forName("reflect.Person");
Object obj=clazz.newInstance(); }
}
类类型--反射:
通过类类型我们可以获取到该类几乎所有的信息,包括成员方法以及成员变量。
大部分的方法都可以通过api或者ide工具了解并使用。需要注意的是method的反射。(getDeclaredMethod()和getMethod() 前者或者本类声明的函数,不管方法访问权限。而getMethod获取的是public的,包括父类集成或者接口继承的方法)
package reflect; import java.lang.reflect.Method; /**
* 方法的反射
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
Class n=Class.forName("reflect.NumUtil");
Object obj = n.newInstance();
Method method = n.getDeclaredMethod("testAdd", int.class,int.class);
method.invoke(obj, 1,2);
}
} class NumUtil{ void testAdd(int a,int b){ System.out.println("testadd的方法:"+(a+b)); } }
Java反射机制简单学习的更多相关文章
- Java反射机制的学习
Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...
- java反射机制简单实例
目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...
- Java反射机制 —— 简单了解
一.概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
- Java反射机制集中学习
什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言 ...
- Java反射机制简单使用
1.Java反射相关类所在package: java.lang.reflect.* 2.开始使用Reflection: 使用reflect相关类,遵循三个步骤: a.获取想要操作类的 java.lan ...
- java反射机制简单介绍
1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2 ...
- java反射机制-简单实例
public class Car { private String brand; private String color; private int maxSpeed; public Car() { ...
- JAVA反射机制—学习总结
最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...
- Java反射机制——学习总结
前几天上REST课,因为涉及到Java的反射机制,之前看过一直没有用过,有些遗忘了,周末找了些资料来重新学习,现在总结一下,加深印象. 什么是反射机制? 参考百度百科对java反射机制的定义: “JA ...
随机推荐
- ui设计的好网站(转载)
设计师网址导航 http://hao.uisdc.com/ 站酷 国外: Dribbble - Show and tell for designers.Behance 这两个网站就够了啊 ————— ...
- bzoj 5125: [Lydsy1712月赛]小Q的书架
新学了一波 决策单调性 dp 套路.... 这种dp一般是长这样的 => f[i][j] = max/min { f[i-1][k] + cost(k+1,j)} ,其中cost函数满足四边形 ...
- Codeforces 869 C The Intriguing Obsession
题目描述 — This is not playing but duty as allies of justice, Nii-chan! — Not allies but justice itself, ...
- 什么是yarn?
[学习笔记] 什么是yarn?马克-to-win @ 马克java社区:YARN (Yet Another Resource Negotiator,另一种资源协调者)是Hadoop的一个资源管理系统, ...
- 【IntelliJ Idea】idea快速创建maven spring项目
想试试AOP在spring的web项目上的使用情况,所以想尽快使用idea快速的搭建一个spring的web项目,当然,是maven管理的项目 步骤如下: 1.打开idea 左上角file---> ...
- 说说GestureDetector.OnGestureListener onScroll函数
public abstract boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) ...
- 2017.2.9 深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二)-----配置文件详解
深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二) ------配置文件详解 8.2 MyBatis-Spring应用 8.2.1 概述 本文主要讲述通过注解配置MyBa ...
- 几种Tab的实现方法
转载请注明出处,谢谢! 学了这久Android,今天来总结一下几种Tab的实现方法 实现方法一: ViewPage来实现 首先创建一个top.xml布局和一个bottom.xml布局,然后在主界面中通 ...
- 使用REST-Assured对API接口进行自动化测试
转载:http://blog.csdn.net/u012050416/article/details/50674612 准备 目标 开始编码 总结 说明:本文只是一个getStart示例,关键在于 ...
- 手把手教你画AndroidK线分时图及指标
先废话一下:来到公司之前.项目是由外包公司做的,面试初,没有接触过分时图k线这块,认为好难,我能搞定不.可是一段时间之后,发现之前做的那是一片稀烂,可是这货是主功能啊.迟早的自己操刀,痛下决心,开搞, ...