java反射系列一

一.概念认知

1.1  ●Java Reflection
Reflection (反射)是被视为动态语言的关键,

反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,

并能直接操作任意对象的内部属性及方法

1.2 ●Java反射机制提供的功能
?在运行时判断任意一 个对象所属的类

?在运行时构造任意-个类的对象
?在运行时判断任意一个类所具有的成员变量和方法

?在运行时调用任意个对象的成员变量和方法

?生成动态代理

1.3  Java反射机制研究及应用
●反射相关的主要API:

?java.lang.Class:代表一 个类
?java.lang.reflect,Method:代表 类的方法

?java.lang.reflect.Field:代表 类的成员变量
?java.lang.reflect.Constructor:代表 类的构造方法


二.代码示例

package reflect;

public class Person {
    public String name;
    private int age;
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    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("我是巫妖果子");
    }
    public void display(String nation) {
        System.out.println("我的国籍是: "+nation);
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}
package reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestReflection {
    public static void main(String[] args) throws Exception {
        TestReflection t = new TestReflection();
        t.test2();
    }
     //反射思想.创建一个类的对象.并调用其中的结构
    public void test2() throws Exception {
        //此代码指向Person类,其所有属性.方法均暴露
        ①Class clazz = Person.class;

        /*
         * 1.创建clazz对应的运行时类Person类的对象
         * public T newInstance()
              throws InstantiationException,
                     IllegalAccessException创建由此类对象表示的类的新实例。
         */
        ②Person p = (Person)clazz.newInstance();
        System.out.println(p);
        /*
         * getField(String name)
         * 返回一个 Field对象,它反映此表示的类或接口的指定公共成员字段 类对象。
         */
        ③Field f1 = clazz.getField("name");
        /*
         * set(Object obj, Object value)
         * 将指定对象参数上的此 Field对象表示的字段设置为指定的新值。
         */
        ④f1.set(p, "巫妖果子");
        System.out.println(p);
        /*
         * 2.私有属性
         * getDeclaredField(String name) 返回一个 Field对象,
         * 它反映此表示的类或接口的指定已声明字段 类对象。
         */
        ⑤Field f2 = clazz.getDeclaredField("age");
        ⑥f2.setAccessible(true);
        f2.set(p, 20);
        System.out.println(p);

        /*
         * 3.通过反射调用运行时类的指定的方法
         *getMethods() 返回包含一个数组 方法对象反射由此表示的类或接口的所有公共方法 类对象,
         *包括那些由类或接口和那些从超类和超接口继承的声明
         */
        ⑦Method m1 = clazz.getMethod("display", String.class);
        /*
         * invoke(Object obj, Object... args)
         * 在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。
         */
        ⑧m1.invoke(p, "中国");

        ⑨Method m2 = clazz.getMethod("show");
        m2.invoke(p);
    }

    //面向对象的思想.创建一个类的对象,并调用其中的方法.属性
    public void test1(){
        Person p = new Person();
        p.setAge(20);
        p.setName("巫妖果子");
        System.out.println(p);
        p.show();
        p.display("中国");
    }
}

程序分析:①②处相当于面向对象的

Person p = new Person();这行代码,创建实例

③处是指定Person中的属性(公共权限)④处设置属性值⑤处由于age属性的权限是私有的,所以

getDeclaredField("age")

起声明作用⑥仅仅是这样还不足以设置私有属性,故有此行代码⑦处指定有参方法⑧处传参

⑨处是无参方法
 

原文地址:https://www.cnblogs.com/zjm1999/p/10329864.html

时间: 2024-10-24 15:01:29

java反射系列一的相关文章

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法.   转载https://my.oschina.net/u/1407116/blog/209383 摘要 java.lang.reflect.Field使用 Field. 首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几种: a)Class.getDeclaredField(String name);      返回一个 Fiel

java反射系列三之类加载器

一.概念认知 二.代码示例 package reflect; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class ClassLoaders { public static void main(String[] args) throws ClassNotFoundException, IOException { ClassLoaders c = new C

java反射系列五之获取类的完整结构

代码示例 Person类 package reflect; @MyAnnotation(value = "guozi") public class Person extends Creature<String> implements Comparable,MyInterface{ public String name; private int age; public Person() { super(); // TODO Auto-generated constructor

java反射系列六之调用属性与方法

调用指定属性 package reflect; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class TestFiled { public static void main(String[] args) throws Exception { TestFiled t = new TestFiled(); t.test3(); } //调用运行时类中的指定的属性 public void test

java反射系列四之创建运行时类的对象

一.概念认知 二.代码示例 package reflect; public class TestConstructor { public static void main(String[] args) throws Exception { TestConstructor T = new TestConstructor(); T.test(); } public void test() throws Exception{ String className = "reflect.Person&quo

Java反射机制大神必学系列之 ,高级与低级的差别在哪里?

Java反射机制大神必学系列之 ,高级与低级的差别在哪里?java学习爱好者 2019-05-20 19:08前言今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文Java反射机制定义 Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.

Java总结篇系列:Java 反射

Java反射: 1 package com.corn; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.InvocationTargetException; 6 import java.lang.reflect.Method; 7 8 public class TestReflect { 9 10 public static void ma

Java反射基础笔记

由于工作中发现自己的基础知识掌握的并不是很牢固,遇到的问题与学习的东西也没有很好的做过记录,导致再遇到时耗费大量时间上网搜索,所以决定串下基础知识并尽量形成记录,方便自己之后遗忘时查询,也方便各位有需求的伙伴翻阅查看,大家共同探讨.学习. 本次梳理的是Java反射的基础,该系列为笔者学习慕课反射讲解视频的学习笔记,尽可能全的记录,以帮助初学者快速掌握反射基础知识,如需转载该系列请注明原文链接. 一.反射之Class类的使用 二.反射之获取方法信息 更多编辑中 --

Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. http://blog.csdn.net/a396901990/article/category/2302221 本文介绍了如何利用反射和注解去简单的模拟JUnit4单元测试框架,之所以选择JUnit4是因为4.0以后最大的改进就是使用了注解.需要注意的是这里并不是完全的模拟,只是简单实现了一下Runner类和JUnit注解相关的工作流程.所以本文的主要目的是介绍反射和注解的使用.废话不多说,直接进入正文