JAVA反射机制

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
 

功能

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
 
代码演示

package com.svse.reflex;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;
import org.junit.Test;
/***
* 类的反射
* @author Administrator
* java反射机制提供的功能
* 在运行时:
* <1>判断任意一个对象所属的类
* <2>构造任意一个类的对象
* <3>判断任意一个类所具有的成员变量和方法
* <4>调用任意一个对象的成员变量和方法
* <5>生成动态代理
*/
public class ClassReflex {

//关于类的加载器classLoader
@Test
public void test5() throws ClassNotFoundException, IOException{
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
System.out.println(classLoader);

ClassLoader classLoader1=classLoader.getParent();
System.out.println(classLoader1);

ClassLoader classLoader2=classLoader1.getParent();
System.out.println(classLoader2);

Class clazz=Person.class;
ClassLoader classLoader3=clazz.getClassLoader();
System.out.println(classLoader3);

String forName="java.lang.String";
Class clazz2=Class.forName(forName);
ClassLoader classLoader4=clazz2.getClassLoader();
System.out.println(classLoader4);

ClassLoader classLoader5=this.getClass().getClassLoader();
InputStream is=classLoader5.getResourceAsStream("com\\svse\\reflex\\db.properties");//读取properties文件信息
Properties properties=new Properties();
properties.load(is);
String name=properties.getProperty("name");
String password=properties.getProperty("password");
System.out.println(name+" : "+password);

}

/***
* 获取class实例的三种方式
* @throws ClassNotFoundException
*/
@Test
public void test4() throws ClassNotFoundException{
//1:调用运行时类本身的class属性
Class clazz=Person.class;
System.out.println(clazz.getName());
Class clazz2=String.class;
System.out.println(clazz2.getName());
//2:通过运行时类的对象获取
Person p=new Person();
Class clazz3=p.getClass();
System.out.println(clazz3.getName());
//3:通过class的静态方法获取 (体会一下反射的动态性)
String forName="com.svse.reflex.Person";
Class clazz4=Class.forName(forName);
System.out.println(clazz.getName());

//4:了解类的加载器classLoader
ClassLoader classLoader=this.getClass().getClassLoader();
Class clazz5=classLoader.loadClass(forName);
System.out.println(clazz5.getName());

System.out.println(clazz==clazz2);
System.out.println(clazz==clazz3);
System.out.println(clazz==clazz4);
System.out.println(clazz==clazz5);

}

/**
* java.lang.Class 是反射的源头
* 通过运行时类的getClass()方法创建实例
*/
@Test
public void test3(){
Person p=new Person();
Class clazz=p.getClass();//通过运行时类的对象,调用其getClass()方法,返回其运行时类
System.out.println(clazz);
}

//有了反射之后,可以通过反射创建一个类的对象,并调用其中的属性和方法
@Test
public void test2() throws Exception{
Class clazz=Person.class;
//1创建clazz对应的运行时类person的对象
Person p=(Person) clazz.newInstance();
System.out.println(p);

//2 通过反射调用类的属性
Field f1=clazz.getField("name");
f1.set(p, "王小米");
System.out.println(p);
//Field f2=clazz.getField("age");
Field f2=clazz.getDeclaredField("age");//如果属性设置为private
f2.setAccessible(true);//必须设置允许访问为true,否则就获取不到私有属性的值
f2.set(p, 26);
System.out.println(p);
//3 通过反射调用类的方法
Method m1=clazz.getMethod("show");
m1.invoke(p);
Method m2=clazz.getMethod("display",String.class);
m2.invoke(p,"china");
//4

}

//在有反射前,传统的方法,如何创建一个类的对象,并调用其中的属性和方法
@Test
public void test1(){
Person p=new Person();
p.setAge(25);
p.setName("张三");
System.out.println(p);
p.show();
p.display("china");
}

}

db.properties文件

name=zhangsan
password=123456

Person.java文件

package com.svse.reflex;

public class Person {

public String name;
private int age;

public Person() {
super();
}

public Person(String name) {
super();
this.name = name;
}

public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}

public void add(String name){
System.out.println("公有的---"+name);
}

private void find(String name){
System.out.println("私有的---"+name);
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

public void show(){
System.out.println("我是一个man");
}
public void display(String nation){
System.out.println("我的国籍是:"+nation);
}

@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}

}

类的反射_reflex的更多相关文章

  1. JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践

    JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识 ...

  2. C#工具:反射帮助类 泛型反射帮助类

    反射帮助类 using System; using System.Reflection; using System.Data; using System.Drawing; using System.R ...

  3. 类的反射及xml文件的解析

    类的反射 xml文件的解析 .properties||.xml配置文件的创建及读取内容 //创建对象 Properties properties = new Properties(); //存储 pr ...

  4. python基础-类的反射

    1)反射是通过字符串方式映射内存中的对象. python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr, 改四个函数分别用于对对象内部执行:检查是 ...

  5. java--分析简单java类与反射的联系

    分析简单java类与反射的联系 web对反射的操作支持 在JSP之中有一种技术--javaBean.而且在jsp里面也配套有相应的操作方式,javaBean的核心在于简单java类,于是下面演示此操作 ...

  6. 类的反射实例(servlet的抽取)

    类的反射实例 具体以后我们写的时候不用写BaseServlet,因为各种框架都已经给我们写好了 所以,user对应的servlet的界面长这样:

  7. Java Class类及反射机制

    java.lang.Class类 声明: public final class Class<T>extends Object implements Serializable, Generi ...

  8. python(7)– 类的反射

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

  9. C# Assembly类_反射

    System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到. 由于这个类实在有太多的字段.属性与方法.实在不想将一个个属性方法从MSDN复制出来然后逐个属性.方法敲 ...

随机推荐

  1. SpringCloud断路器监控面板——Hystrix Dashboard

    一.简介 Hystrix Dashboard是Hystrix的一个组件,Hystrix Dashboard提供一个断路器的监控面板,可以使我们更好的监控服务和集群的状态,仅仅使用Hystrix Das ...

  2. 逆向知识之CS辅助/外挂专题.2.实现CS1.6无限夜视仪.无限闪光烟雾高爆弹.

    逆向知识之CS辅助/外挂专题.2.实现CS1.6无限夜视仪.无限闪光烟雾高爆弹. 关于人物子弹无限可以观看上一篇博客. 一丶无限夜视仪. 无限夜视仪找法. 1.CE附加游戏. 2.搜索0或者1. 3. ...

  3. HttpClient Timeout waiting for connection from pool 问题解决方案

    错误:org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool 前言 ...

  4. phpStorm使用技巧总结

    工欲善其事,必先利其器. 拥有一个好的工具不仅可以事半功倍,而且也令人神清气爽. 在编辑器上,我所走过的路是这样的:notepad(对,就是最原始的WIN下的note) -> editplus ...

  5. 方便操作的命名范围scope

    <?php namespace Goods\Model; use Think\Model; class GoodsModel extends Model { protected $_scope ...

  6. 基于 JDK 的动态代理机制

    『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问. 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所 ...

  7. nginx配置指南

    nginx(读作engine x)是一款设计优秀的Http服务器, 其占用内存少, 负载能力强且稳定性高, 正在被越来越多的用户所采用. nginx可以为HTTP, HTTPS, SMTP, POP3 ...

  8. SPI OLED 驱动

    根据之前说过的 SPI 驱动的框架,在我们添加 SPI 设备驱动的时候需要与 SPI Master 完成匹配,通过 spi_register_board_info 进行注册. 构造设备 static ...

  9. Uboot 引导内核时加载地址与入口地址问题

    如果使用 mkimage 生成内核镜像文件的话,会在内核的前头加上了 64 bytes 的信息头,供建立 tag 之用.bootm 命令会首先判断 bootm xxx 这个指定的地址 xxx 与 -a ...

  10. 【Spring】24、<load-on-startup>0</load-on-startup>配置

    load-on-startup标记容器是否在启动的时候实例化并调用其init()方法的优先级. 它的值表示servlet应该被载入的顺序 当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个s ...