java 基础之 反射技术
1. java代码
在 java 语言中最核心的就是代码的运行, 按照面向对象的思想,在调用java代码时往往需要先创建对象,再调用方法, 而写在方法中的即所谓的java 代码
一段java代码在程序运行期间会经历三个阶段: source-->class-->runtime
2. Class 对象
在java中用一个Class对象来表示一个java类的class阶段
Class对象封装了一个java类中定义的成员变量、成员方法、构造方法、类名、包名等
获得class对象的三种方式和区别
// 1. 根据给定的类名来获得 用于类加载
String classname ="cn.itcast.reflect.Person"; //来自配置文件
Class clazz = Class.forName(classname); // 此对象代表Person.class
// 2. 如果拿到了对象,不知道是什么类型 用于获得对象的类型
Object obj = new Person();
Class clazz1 = obj.getClass(); // 获得对象具体的类型
// 3. 如果是明确地获得某个类的Class对象 主要用于传参
Class clazz2 = Person.class;
// 在java中所有的类型都会对应一个Class对象 int Integer
Class intClazz = int.class;
Class intarrClazz = int[].class;
Class voidClazz = void.class;
3. 反射的概念
反射就是获得一个java类的各个组成部分
// 反射类的成员方法
Class clazz = Person.class;
Method method =clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
method.invoke();
// 反射类的构造函数
Constructor con =clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})
con.newInstance(params...)
// 反射类的属性
Field field =clazz.getField(fieldName);
field.setAccessible(true);
field.setObject(value);
4. 反射用在哪里
到底框架是什么? 框架就是将开发中大量重复的代码集中起来写个通用的程序
框架就是用反射来实现的
框架需要现在的类调用将来写的类
框架是将来的程序员调用的,框架不能实现完整的功能,框架只是一些一些通用的代码
框架要运行一定会依赖将来写的类
现在写的类要调用将来写的类,我们先针对接口进行调用,将来的类需要实现接口,那么方法就固定了
但是将来写的类的类名我们无法获知,这时就需要调用者通过配置文件告诉框架具体的类名
Person.java
// 1. 根据给定的类名来获得 用于类加载
package xgp_reflect;
import java.awt.List;
import java.io.InputStream;
public class Person {
publicString name= "aaaa";
privatestatic int password=123;
//1、类构造函数
publicPerson(){
System.out.println("无参数构造函数!");
}
publicPerson(String name){
System.out.println(name);
}
publicPerson(String name, int password){
System.out.println(name+password);
}
privatePerson(List list){
System.out.println("list");
}
//2、方法
publicvoid aa1(){
System.out.println("aa1无参数方法");
}
publicvoid aa1(String name, int password){
System.out.println(name+":"+password+"两个参数的方法");
}
publicvoid aa1(InputStream in){
System.out.println(in);
}
publicClass[] aa1(String name, int[] password){
returnnew Class[]{String.class} ;
}
privatestatic void aa1(int num){
System.out.println(num+"静态方法");
}
public static void main(String[] args){
System.out.println("main");
}
}
Demo01.java
package xgp_reflect;
public class Demo01 {
/**
*
* 反射,加载类,获得类的字节码
* @throws ClassNotFoundException
*/
publicstatic void main(String[] args) throws ClassNotFoundException {
//方法1
Classclazz = Class.forName("/stringjava/src/xgp_reflect/Person.java");
//方法2
Classclazz2 = new Person().getClass();
//方法3
Classclazz3 = Person.class;
}
}
Demo02.java
// package xgp_reflect;
import java.awt.List;
importjava.lang.reflect.Constructor;
importjava.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import org.junit.Test;
public class Demo02 {
/**
* 反射类的构造函数,创建类的对象
*/
@Test
//反射构造函数publicPerson()
publicvoid test1() throws Exception{
Classclazz = Class.forName("xgp_reflect.Person");
Constructorc = clazz.getConstructor(null);
Personp = (Person) c.newInstance(null);
System.out.println(p.name);
}
//反射构造函数publicPerson(String name)
@Test
publicvoid test2() throws Exception{
Classclazz = Class.forName("xgp_reflect.Person");
Constructorc = clazz.getConstructor(String.class);
Personp = (Person) c.newInstance("xxxx");
System.out.println(p.name);
}
//反射构造函数publicPerson(String name, int password)
@Test
publicvoid test3() throws Exception{
Classclazz = Class.forName("xgp_reflect.Person");
Constructorc = clazz.getConstructor(String.class, int.class);
Personp = (Person) c.newInstance("xiaoguoping",25);
System.out.println(p.name);
}
//反射构造函数publicPerson(List list)
@Test
publicvoid test4() throws Exception{
Classclazz = Class.forName("xgp_reflect.Person");
Constructorc = clazz.getDeclaredConstructor(List.class);
c.setAccessible(true);
Personp = (Person) c.newInstance(new List());
System.out.println(p.name);
}
//无参数构造函数的另一种方法
@Test
publicvoid test5() throws Exception{
Classclazz = Class.forName("xgp_reflect.Person");
Personp = (Person) clazz.newInstance();
System.out.println(p.name);
}
}
Demo03.java
// package xgp_reflect;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import org.junit.Test;
public class Demo3 {
/**
* 反射类的方法
*/
@Test
//反射类的方法--publicvoid aa1()
publicvoid test1() throws Exception{
Personp = new Person();
Classclazz = Class.forName("xgp_reflect.Person");
Methodmethod = clazz.getMethod("aa1", null);
method.invoke(p,null);
}
@Test
//反射类的方法--publicvoid aa1(String name, int password)
publicvoid test2() throws Exception{
Personp = new Person();
Classclazz = Class.forName("xgp_reflect.Person");
Methodmethod= clazz.getMethod("aa1", String.class,int.class);
method.invoke(p,"xiaoguoping",25);
}
@Test
//反射类的方法--publicClass[] aa1(String name, int[] password)
publicvoid test3() throws Exception{
Personp = new Person();
Classclazz = Class.forName("xgp_reflect.Person");
Methodmethod= clazz.getMethod("aa1", String.class,int[].class);
Classcs[] = (Class[]) method.invoke(p, "xiaoguoping", new int[]{1,2});
System.out.println(cs[0]);
}
@Test
//反射类的方法--publicvoid aa1(InputStream in)
publicvoid test4() throws Exception{
Personp = new Person();
Classclazz = Class.forName("xgp_reflect.Person");
Methodmethod= clazz.getMethod("aa1",InputStream.class);
method.invoke(p,newFileInputStream("C:\\unknow.log"));
}
@Test
//反射类的方法--privatestatic void aa1(int num)
publicvoid test5() throws Exception{
//Personp = new Person();静态方法可以不传对象
Classclazz = Class.forName("xgp_reflect.Person");
Methodmethod= clazz.getDeclaredMethod("aa1",int.class);
method.setAccessible(true);
method.invoke(null,23);
}
@Test
//反射类的方法--publicstatic void main(String[] args)
publicvoid test6() throws Exception{
Classclazz = Class.forName("xgp_reflect.Person");
Methodmethod= clazz.getMethod("main",String[].class);
//method.invoke(null,newString[]{"aa","bb"});//JDK1.4 main(string s1,string s2)拆开参数赋值
//method.invoke(null,(Object)new String[]{"aa","bb"});
method.invoke(null,new Object[]{new String[]{"aa","bb"}});
}
}
Demo04.java
// package xgp_reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
public class Demo04 {
/**
* 反射类的字段--属性,封装数据
*/
@Test
//反射类的字段--publicString name= "aaaa";
publicvoid test1() throws Exception{
Personp = new Person();
Classclazz = Class.forName("xgp_reflect.Person");
Fieldfield = clazz.getField("name");
//获取字段的值
Objectvalue= field.get(p);
//获取字段的类型
Classtype = field.getType();
if(type.equals(String.class)) {
Stringsvalue = (String) value;
System.out.println(svalue);//aaaa
}
//设置字段的值
field.set(p,"xxxx");
System.out.println(p.name);//xxxx
}
@Test
//反射类的字段--privatestatic int password=123;
publicvoid test2() throws Exception{
Personp = new Person();
Classclazz = Class.forName("xgp_reflect.Person");
Fieldfield = clazz.getDeclaredField("password");
field.setAccessible(true);
Objectvalue = field.get(p);
System.out.println(value);
}
}
版权声明:本文为小平果原创文章,转载请注明:http://blog.csdn.net/i10630226
java 基础之 反射技术的更多相关文章
- 黑马程序员:Java基础总结----反射
黑马程序员:Java基础总结 反射 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 反射 反射的基石:Class类 Class类代表Java类,它的各个实例对象又分别 ...
- 第89节:Java中的反射技术
第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...
- Java基础-零拷贝技术应用案例
Java基础-零拷贝技术应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 零拷贝技术在Hadoop生态圈中很多组件得到应用,典型的比如kafka组件,它就很成功的应用了零拷贝 ...
- Java基础之一反射
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...
- Java基础之—反射
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...
- Java基础教程——反射机制
Java反射机制 Java反射机制是Java语言的一个重要特性,使得Java语言具备"动态性": 在运行时获取任意一个对象所属的类的相关信息; 在运行时构造任意一个类的对象: 在运 ...
- 黑马程序员:Java编程_反射技术
=========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性 ...
- 黑马程序员——JAVA基础之反射
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态 ...
- java基础之反射---重要
java反射: 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)): 1:获取Class字节码文件对象的三种方式: /** ...
随机推荐
- VS2010 / MFC + OpenCV 2.4.9打开图片
原文地址:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=30832 第一部分,参考http://jingyan.baidu.com ...
- android EventBus详解(一)
EventBus 是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent, Handler, BroadCast 在 Fragment,Activity,Service,线程之间 ...
- Mina源码阅读笔记(四)—Mina的连接IoConnector2
接着Mina源码阅读笔记(四)-Mina的连接IoConnector1,,我们继续: AbstractIoAcceptor: 001 package org.apache.mina.core.rewr ...
- linux下64位汇编的系统调用(4)
经过上一篇的铺垫貌似可以很轻松的用汇编写出mmap的代码来,可仔细一看,还是有不少问题需要解决: 1.系统调用mmap如果出错并不直接返回MAP_FAILED(-1),而是一个"类似&quo ...
- 高仿qq健康
概述 学习别人的代码,在此基础上 优化代码结构 增加动画 要点记录 通过mRatio参数,让宽高始终是一个比例 贝塞尔曲线手动画矩形圆角 画虚线 根据基准点绘制文字 属性动画的使用 画笔宽度的自适应 ...
- 学习ASP.NET Core Razor 编程系列八——并发处理
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- webservice入门简介
为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 webservice入门简介 1.什么是webservice? webservice是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓的远 ...
- datetime的精度
最近有需要将分钟线的数据进行内联拼接,但时间没有必要精确到秒,微秒. df['datetime'] = pd.to_datetime(df['datetime']) df = df.set_index ...
- 使用springmvc时静态的文件获取不到,比如说样式丢失的问题。
当使用springmvc时前台所有的样式全部都消失不见了,查了很多资料,简单的说就是我在配置web.xml中的过滤器时将<url-pattern></url-pattern>中 ...
- 判断某个方法是否存在,解析php函数function_exists (),method_exists()与is_callable()的区别
php函数function_exists (),method_exists() 与is_callable()的区别在哪? 先来讲下后两个:method_exists() 与is_callable(): ...