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. 【JAVA】ThreadLocal源码分析

    ThreadLocal内部是用一张哈希表来存储: static class ThreadLocalMap { static class Entry extends WeakReference<T ...

  2. 深入学习Tesseract-ocr识别中文并训练字库的方法

    上篇文章简单的学习了tesseract-ocr识别图片中的英文(链接地址如下:https://www.cnblogs.com/wj-1314/p/9428909.html),看起来效果还不错,所以这篇 ...

  3. #6 Python数据类型及运算

    前言 前文讲述了Python的输入输出以及变量的相关知识点,本节将探讨Python的数据类型以及数据之间的运算方式! 一.Python数据类型 上一节弄清了变量,其实变量所指向的值是有自己独特的数据类 ...

  4. Python使用@property装饰类方法

    Python版本:3.5.2 假如我们有一个Student类,并在其中定义了一个score属性,但是score属性会被显露出去,没办法检查参数,导致成绩可以随意更改: stu = Student() ...

  5. LINQ分页和排序,skip和Take 用法

    LINQ分页和排序,skip和Take 用法 dbconn.BidRecord.OrderBy(p=>p.bid_id).ToList<BidRecord>().OrderBy(p ...

  6. Spring的IOC/DI使用到的技术

    一.了解Spring IOC/DI 1:Spring有两大核心技术,控制反转(Inversion of Control, IOC)/依赖注入(Dependency Injection,DI)和面向切面 ...

  7. 【Linux】Centos之安装Nginx及注意事项

    相关内容链接 [Linux]nginx常用命令 [nginx]详细配置说明 1.Nginx的简单说明 a.  Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务 ...

  8. 深入理解Java虚拟机--阅读笔记三

    垃圾收集器 手机算法是内存回收的方法论,垃圾收集器是内存回收的具体实现. 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:值用户线程与垃圾收集线程同时执行(但并不一定是并行的) ...

  9. HashMap底层实现原理(JDK1.8)源码分析

    ref:https://blog.csdn.net/tuke_tuke/article/details/51588156 http://www.cnblogs.com/xiaolovewei/p/79 ...

  10. 9种网页Flash焦点图和jQuery焦点图幻灯片

    jQuery图标放大轮播焦点图 Flash图片焦点图滑动切换 Flash右侧焦点图上下滑动切换 左右按钮滑动切换的网页幻灯片 双图同时滑动切换的焦点图 含有上下按钮的双图同时滑动切换的焦点图 常见的j ...