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 基础之 反射技术的更多相关文章

  1. 黑马程序员:Java基础总结----反射

    黑马程序员:Java基础总结 反射   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 反射 反射的基石:Class类 Class类代表Java类,它的各个实例对象又分别 ...

  2. 第89节:Java中的反射技术

    第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...

  3. Java基础-零拷贝技术应用案例

    Java基础-零拷贝技术应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 零拷贝技术在Hadoop生态圈中很多组件得到应用,典型的比如kafka组件,它就很成功的应用了零拷贝 ...

  4. Java基础之一反射

    反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))   一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...

  5. Java基础之—反射

    反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))   一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...

  6. Java基础教程——反射机制

    Java反射机制 Java反射机制是Java语言的一个重要特性,使得Java语言具备"动态性": 在运行时获取任意一个对象所属的类的相关信息; 在运行时构造任意一个类的对象: 在运 ...

  7. 黑马程序员:Java编程_反射技术

    =========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性 ...

  8. 黑马程序员——JAVA基础之反射

      ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! -------     Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态 ...

  9. java基础之反射---重要

    java反射: 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)):   1:获取Class字节码文件对象的三种方式: /** ...

随机推荐

  1. 一个简单的基于 DirectShow 的播放器 1(封装类)

    DirectShow最主要的功能就是播放视频,在这里介绍一个简单的基于DirectShow的播放器的例子,是用MFC做的,今后有机会可以基于该播放器开发更复杂的播放器软件. 注:该例子取自于<D ...

  2. 在AndroidManifest.xml文件中设置Android程序的启动界面方法

    从网上搜集了一堆的Android代码,比如Android的Login程序和Android的Helloworld程序,但是却总不能正确运行一个正确的程序,郁闷了很久,终于在一次一次的测试后成功的在And ...

  3. EBS R12安装升级(FRESH)(二)

    3 Linux系统设置 这一节步骤基本都在终端root用户下进行. 自行熟悉vi或其他文本工具的用法. 3.1 host-only外网连接 如果用的NAT模式这一节略过. 右击当前主机连接外网的网卡, ...

  4. 安卓学习笔记一 Activity延迟转跳实现欢迎界面

    新人学习安卓,为了刚好的学习,现做如下笔记..同时希望自己的经验可以帮助新人们学习入门. 几乎每个app都有个欢迎界面,我们可以使用Activity转跳来实现. 首先建立一个MainActivity ...

  5. linux内核自旋锁API

    我们大概都了解,锁这种机制其实是为了保护临界区代码的,关于使用和定义,我总结的API如下: #include <linux/spinlock.h> 定义自旋锁 spinlock_t loc ...

  6. mysql-proxy中的admin-lua-script

    [root@ecs-7b55 lua]# cat admin.lua --[[ $%BEGINLICENSE%$ Copyright (c) 2008, 2012, Oracle and/or its ...

  7. 浮点数据有损压缩算法 附完整C代码

    在几年前的时候在做修图APP算法的时候, 曾经一度想过对3D Lut 预设数据进行压缩, 主要用于提升用户体验. 关于3d lut算法开源的资源也挺多的,就不多做科普了. 有兴趣的朋友,可以去查阅下f ...

  8. 排序算法入门之选择排序-Java实现

    本文参考http://blog.csdn.net/m0_37568091/article/details/78023705 选择排序是先从对象数组中选出最小的放在第一个位置,再从剩下的元素中选择次小的 ...

  9. 运行Applet程序

    [操作方法1:]① 编辑源程序welcome.java.② 编译程序 javac welcome.java③ 将Applet嵌入HTML网页.方法是,用记事本创建一个文件,文件内容如下:<app ...

  10. 大型B2C网站高性能可伸缩架构技术探秘

    大型B2C网站高性能可伸缩架构技术探秘 2010-07-21 08:51 狂放不羁 JavaEye 字号:T | T 向您介绍大型B2C网站高性能的网站架构技术,包括缓存的使用.应用程序和数据库的拆分 ...