精华内容
下载资源
问答
  • C#反射应用实例

    2020-12-31 07:16:07
    本文实例讲述了C#反射应用。分享给大家供大家参考。具体如下: 通过反射实现多系统数据库的配置 通过定义接口,反射实例化配置的节点的值 配置App.config: 代码如下:<?xml version=”1.0″ encoding=”utf-8″ ...
  • php反射应用示例

    2020-10-26 05:34:25
    主要介绍了php反射应用示例,需要的朋友可以参考下,代码很简单,直接看下面的代码吧
  • Java反射应用实例

    2012-01-10 01:43:48
    代码主要实现了Java反射应用实例, 包含利用反射方法创建对象(使用默认构造函数和自定义构造函数),访问对应对象的方法(包括带参数的和不带参数的),访问对应对象的域(Field). 从这里可以看到代码的详细解说:...
  • java反射应用详细介绍

    2020-09-05 18:07:37
    本篇文章依旧采用小例子来说明java反射应用,因为我始终觉的,案例驱动是最好的,需要的朋友可以参考下
  • 是一个 关于c#反射的几乎最好最全面的例子。
  • XML解析与反射机制的初步应用,里面包含了XML解析工具的使用,以及反射机制执行XML文档所描述的未来定义类的方法调用!
  • 八年级物理光反射应用PPT学习教案.pptx
  • 文章目录一、Java反射定义二、Java反射机制实现1、Class对象获取2、获取class对象的摘要信息3、获取class对象的属性、方法、构造函数等三、反射应用场景1、动态代理2、自定义注解实现日志管理 写在前面:Java反射...
  • .net 反射应用

    2013-03-29 11:06:37
    .net 反射应用,根据config配置信息 来动态读取相应类,共包含两个小项目一个c/s模式; 一个b/s模式
  • Python3之反射应用

    2017-08-12 11:51:30
    反射主要根据字符串去寻找类的属性值,主要用于用户交互,出发类内函数运行

    反射

    反射主要根据字符串去寻找类的属性值,主要用于用户交互,触发类内函数运行

    展开全文
  • java反射机制应用

    2012-01-06 15:53:29
    java反射机制应用,文档中列举了使用java反射机制的各个应用场景,加以代码实例,使用学习非常方便。
  • java中的反射应用

    千次阅读 多人点赞 2019-09-23 10:24:13
    反射 我们先创建一个Student类出来。注意类中的成员变量、构造方法、成员方法公共还是私有 package com.reflect; public class Student { //成员变量 public String name;//公共 private int age;//私有 //...

    反射

    我们先创建一个Student类出来。注意类中的成员变量、构造方法、成员方法公共还是私有

    package com.reflect;
    
    public class Student {
    	//成员变量
    	public String name;//公共
    	private int age;//私有
    	
    	//构造方法
    	public Student() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    
    	//私有构造方法
    	private Student(String name) {
    		this.name = name;
    	}
    	
    	public Student(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    
    	//成员方法(getXxx/setXxx)
    	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 study() {
    		System.out.println("我爱学习java!");
    	}
    	// 私有
    	private void study(String string) {
    		System.out.println("我还爱学习"+string);
    	}
    	@Override
    	public String toString() {
    		return "Student [name=" + name + ", age=" + age + "]";
    	}
    }
    
    
    

    反射概述

    1. 反射:反射是通过class文件对象,去使用文件对象的成员方法、构造方法、成员变量
      回想之前我们使用对象方法时必须通过new对象去使用。new Student().study(),此时我们就发现了一个问题,小例中我们肯定是知道Student类中是有study()方法的,如果我们想使用用这个类但却不清楚类中的信息,此时反射就起到了一定作用。
      其实反射的作用,不止这一点点。如下
    2. 反射可以提高程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提高硬编码目标类
      Java反射技术应用领域很广,后期如软件测试、JavaBean等都有很重要的作用
      许多流行的开源框架例如Struts、Hibernate、Spring在实现过程中都采用了该技术
    3. 性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此Java反射机制只要应用在对;灵活性和扩展性要求很高的系统框架上,普通程序不建议使用使用反射会模糊程序内部逻辑:程序员希望在代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。

    反射获取Class类对象

    1. 要想使用反射,我们必须得到class文件对象,也就是我们要使用的类Class对象
    2. 三种获得class文件对象的方法:
      • Object类的getClass()方法
      • 数据类型的静态属性class
      • Class类中的静态方法public static Class forName(String classname)
        一般我们使用第三种
    package com.reflect;
    
    public class Demo {
    	public static void main(String[] args) throws ClassNotFoundException {
    		// 方式1
    		Student p = new Student();
    		Class c = p.getClass();
    
    		Student p2 = new Student();
    		Class c2 = p2.getClass();
    
    		System.out.println(p == p2);// false不是同一Student对象
    		System.out.println(c == c2);// true是同一class对象
    
    		// 方式2
    		Class c3 = Student.class;
    		System.out.println(c == c3);//true是同一class对象
    
    		// 方式3
    		// ClassNotFoundException(类找不到时)
    		Class c4 = Class.forName("com.reflect.Student");
    		System.out.println(c == c4);//true是同一class对象
    	}
    
    }
    
    

    Class类中相关的几个类

    • 和成员变量有关 Field
    • 和构造方法有关 Constructor
    • 和成员方法有关 Method
      有关的几个方法
    • public T newInstance(Object… initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

    反射获取构造方法

    先来认识几个方法

    public Constructor getConstructor()// 公共构造方法对象
    public Constructor[] getConstructors()//所有公共构造方法对象
    public Constructor[] getDeclaredConstructors()//所有构造方法对象
    public Constructor getDeclaredConstructor()//获取私有构造方法对象
    public Constructor<T> getConstructor(Class<?>... parameterTypes)// 参数表示的是:你要获取的构造方法的构造参数个数及数据类型的class字节码文件对象
    public void setAccessible(boolean flag)// 值为true则指示反射的对象在使用时应该取消Java语言访问检查。  暴力访问
    
    package com.reflect;
    
    import java.lang.reflect.Constructor;
    
    public class ConstructorDemo {
    	public static void main(String[] args) throws Exception {
    		// 获取字节码文件对象
    		Class c = Class.forName("com.reflect.Student");
    		
    		// 获取所有构造方法
    		Constructor[] cons = c.getDeclaredConstructors();
    		for (Constructor con : cons) {
    			System.out.println(con);
    		}
    
    		// 获取单个构造方法
    		Constructor con = c.getConstructor();// 返回的是构造方法对象
    		Constructor con1 = c.getConstructor(String.class, int.class);// 返回的是有参构造方法对象
    		Constructor con2 = c.getDeclaredConstructor(String.class);
    		//创建对象 
    		Object obj = con.newInstance();
    		Object obj1=con1.newInstance("小米",12);
    		// 暴力访问
    		con2.setAccessible(true);// 值为true则指示反射的对象在使用时应该取消Java语言访问检查。
    		Object obj2 = con2.newInstance("小白");
    		
    		System.out.println(obj.toString());
    		System.out.println(obj1.toString());
    		System.out.println(obj2.toString());
    		
    	}
    }
    
    

    运行结果:
    在这里插入图片描述

    反射获取成员变量

    **类比上面Constructor类中的方法,这个类也有同样的方法,获取所有成员变量(返回数组),获取私有成员变量等 这里不再赘述 **

    package com.reflect;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    
    /*
     * 通过发生获取成员变量并使用
     */
    public class FieldDemo {
    	public static void main(String[] args) throws Exception {
    		// 获取字节码文件对象
    		Class c = Class.forName("com.reflect.Student");
    
    		// 获取所有的成员变量
    		 Field[] fields = c.getFields();
    		 Field[] fields1 = c.getDeclaredFields();
    		 for (Field field : fields1) {
    		 System.out.println(field);
    		 }
    
    		/*
    		 * Person p = new Person(); p.address = "北京"; System.out.println(p);
    		 */
    
    		// 通过无参构造方法创建对象
    		Constructor con = c.getConstructor();
    		Object obj = con.newInstance();
    		System.out.println(obj);
    
    		// 获取单个的成员变量
    		//通过成员变量名
    		Field nameField = c.getField("name");
    		// public void set(Object obj,Object value)
    		// 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
    		nameField.set(obj, "小红"); // 给obj对象的addressField字段设置值为"北京"
    		System.out.println(obj);
    
    		// 获取age并对其赋值
    		// NoSuchFieldException  私有变量
    		Field ageField = c.getDeclaredField("age");
    		// IllegalAccessException 暴力访问
    		ageField.setAccessible(true);
    		ageField.set(obj, 18);
    		System.out.println(obj);
    
    	}
    }
    
    

    运行结果:
    在这里插入图片描述

    反射获取成员方法

    **类比上面Constructor类中的方法,这个类也有同样的方法,获取所有成员方法(返回数组),获取私有成员方法等 这里不再赘述 **

    package com.reflect;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    public class MethodDemo {
    	public static void main(String[] args) throws Exception {
    		// 获取字节码文件对象
    		Class c = Class.forName("com.reflect.Student");
    
    		// 获取所有的方法
    		 Method[] methods = c.getMethods(); // 获取自己的包括继承父亲的公共方法
    		 Method[] methods1 = c.getDeclaredMethods(); // 获取自己的所有的方法
    		 for (Method method : methods1) {
    		 System.out.println(method);
    		 }
    
    		Constructor con = c.getConstructor();
    		Object obj = con.newInstance();
    		
    		// 获取单个方法并使用
    		// public void show()
    		// public Method getMethod(String name,Class<?>... parameterTypes)
    		// 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
    		Method m1 = c.getMethod("study");
    		// public Object invoke(Object obj,Object... args)
    		// 返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数
    		m1.invoke(obj); // 调用obj对象的m1方法
    
    		System.out.println("----------");
    		Method m2 = c.getDeclaredMethod("study", String.class);
    		// NoSuchMethodException 访问私有方法  暴力访问
    		m2.setAccessible(true);
    		m2.invoke(obj, "数学");
    	}
    }
    
    

    运行结果:
    在这里插入图片描述

    到这里,最基本的反射就完了,希望本文对你有帮助,关注支持一波,多多指正,谢谢哦

    展开全文
  • Java试题-3:反射和泛型的综合应用 Java反射 泛型都是比较高级的应用技术
  • 主要介绍了Java 反射反射应用场景的相关资料,帮助大家更好的理解和学习Java反射的相关知识,感兴趣的朋友可以了解下
  • 反射的基本应用

    万次阅读 多人点赞 2018-12-28 08:28:10
    原理:反射首先是能够获取到Java中的反射类的字节码,然后将字节码中的方法,变量,构造函数等映射成 相应的 Method、Filed、Constructor 等类 应用:取出类的modifiers,数据成员,方法,构造器,和超类 找出某个接口里...

    原理:反射首先是能够获取到Java中的反射类的字节码,然后将字节码中的方法,变量,构造函数等映射成 相应的 Method、Filed、Constructor 等类
    应用:取出类的modifiers,数据成员,方法,构造器,和超类
    找出某个接口里定义的常量和方法说明.
    取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.
    在运行时刻调用动态对象的方法.

    1,类的加载

    当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实
    现对这个类进行初始化。

    • 加载 就是指将 class 文件读入内存,并为之创建一个 Class 对象。 任何类被使用时系统都会建立一个 Class 对象
    • 连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用
    • 初始化

    1.2类的初始化

    1. 创建类的实例
    2. 类的静态变量,或者为静态变量赋值
    3. 类的静态方法
    4. 使用反射方式来强制创建某个类或接口对应的 java.lang.Class 对象
    5. 初始化某个类的子类

    1.3反射概述

    Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称 为 java 语言的反射机制。

    要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖这个类,使用的就是 Class 类中的方法,所以先要获取到每一个字节码文件所对应的 Class 类型对象。

    1.4准备数据,我就用我现在的写的项目的数据,大家随意

    在这里插入图片描述

    1.5 知识储备

    需要掌握 6 个单词

    • Class 类
    • Constructor 构造
    • Method 方法
    • Filed 字段
    • instance 实例
    • invoke 执行

    1.6 Class 获得方式

    在这里插入图片描述

    public class A {
        /**
         * class获得方式
         *
         * @param args
         */
        public static void main(String[] args) {
            //1 通过类型获得
            // 语法:类名.class
            // 应用场景:确定类型 等
            Class clazz1 = BrandController.class;
            System.out.println("语法:类名.class|" + clazz1);
    
            //2 通过实例对象获得
            // 语法:变量.getClass()
            // 应用场景:在方法内部通过参数获得类型 等
            BrandController brandController = new BrandController();
            Class<? extends BrandController> aClass = brandController.getClass();
            System.out.println("语法:变量.getClass()|" + aClass);
    
    
            //3 通过字符串获得
            // 语法:Class.forName("全限定类名")
           // 应用场景:通过配置获得字符串 等
            try {
                Class<?> aClass1 = Class.forName("com.controller.BrandController");
                System.out.println("Class.forName(\"全限定类名\")|"+aClass1);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
        }
    
    
    }
    
    

    1.6.1 得到这个类的名字

    在这里插入图片描述

          //1 获得 Class
           Class clazz = User.class;
           // 得到这个类的名字:全限定类名
            String name = clazz.getName();
            //  这个只是类的名字
            String simpleName = clazz.getSimpleName();
            System.out.println(" 这个只是类的名字simpleName:"+simpleName);
    
            System.out.println("得到这个类的名字:全限定类名name:"+name);
    
    
    
    
    

    1.7构造方法与实例

    在这里插入图片描述

    public class A {
        /**
         * 构造方法与实例
         *
         * @param args
         */
        public static void main(String[] args) {
            //无参构造 , 并实例化
    
            //1 获得 Class
            Class<SpecificationOption> specificationOptionClass = SpecificationOption.class;
            System.out.println("获得 Class"+specificationOptionClass);
            //2 获得构造 -- 没有形参
            Constructor<SpecificationOption> constructor = null;
            try {
                constructor = specificationOptionClass.getConstructor();
                System.out.println("获得构造 -- 没有形参"+constructor);
                SpecificationOption specificationOption = constructor.newInstance();
                System.out.println("实例对象,没有实参"+specificationOption);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    获取无参的简化版

    在这里插入图片描述

    
    public class A {
        /**
         * 构造方法与实例
         *
         * @param args
         */
        public static void main(String[] args) {
            //无参构造 , 并实例化
    
            //1 获得 Class
            try {
                // 获得无参的简化版
                SpecificationOption specificationOption = SpecificationOption.class.newInstance();
                System.out.println(specificationOption);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
    
    
        }
    }
    

    获取有参构造

    在这里插入图片描述
    在这里插入图片描述

    public static void main(String[] args) {
            //有参构造 , 并实例化
            //1 获得 Class
            Class beanClass = SpecificationOption.class;
            //2 获得构造 -- 三个字符串形参 -- (Integer.class,String.class,Integer.class)
            Constructor constructor = null;
            try {
                constructor = beanClass.getConstructor(Integer.class, String.class, Integer.class);
                System.out.println("获得构造 -- 三个字符串形参" + constructor);
                //3 实例对象,三个字符串实参
                Object o = constructor.newInstance(2323,"白色", 1);
                System.out.println(o);
            } catch (Exception e) {
                e.printStackTrace();
    
            }
    
        }
    

    1.7.5 扩展:私有构造(暴力反射)

    • 修改 Bean 添加私有构造
    private Bean(String id) {
    this.id = id;
    System.out.println("有参构造:" + id);
    }
    
    • getConstructor() 使用该方法将无法获得私有方法,程序运行抛异常
    • 在这里插入图片描述
    • 没有使用 setAccessible(true),将抛异常
    • 在这里插入图片描述
      在这里插入图片描述
    @Test
    public void testPrivateCons() throws Exception{
    //私有构造
    //1 获得 Class
    Class beanClass = Bean.class;
    //2 获得构造 -- 两个字符串形参 -- Bean(String id, String className)
    // * getConstructor() 将抛异常 java.lang.NoSuchMethodException
    // * getDeclaredConstructor 可以获得私有构造
    Constructor constructor = beanClass.getDeclaredConstructor(String.class)
    //暴力访问
    constructor.setAccessible(true);
    //3 实例对象,两个字符串实参
    Object bean = constructor.newInstance("userId");
    System.out.println(bean);
    
    

    1.8方法与执行

    1.8.1public 方法
    • 获得方法并设置
      在这里插入图片描述
      //1 获得 Class
            Class clazz = User.class;
            //2 获得实例 ,相当于 Object obj = new Bean();
            Object obj = clazz.newInstance();
            //3 操作 setAge 方法
            // * 格式:getMethod(方法名,形成列表)
            Method setMethod = clazz.getMethod("setAge", Integer.class);
    
            System.out.println("getMethod(方法名,形成列表)"+setMethod);
            //3.2 执行方法,一个实参
            Object setReturnObj = setMethod.invoke(obj, 12);
            System.out.println("set 方法返回值:" + setReturnObj);
    
    
    1.8.2私有方法(暴力反射)private

    添加私有方法
    在这里插入图片描述

    在这里插入图片描述

    
            //4 操作 getId 方法
            // 4.1 获得方法,没有形参
            Method getMethod = clazz.getMethod("getAge");
            // 4.2 执行方法,没有实参
            Object getReturnObj = getMethod.invoke(obj);
            System.out.println("get 方法返回值:" + getReturnObj);
    
    
             //5 暴力反射私有的构造方法
            Method showMethod = clazz.getDeclaredMethod("show");
            System.out.println("暴力反射私有的构造方法show     "+showMethod);
             //暴力访问
            showMethod.setAccessible(true);
              // 4 执行方法,没有实参
            // obj.setMethod(args)     user.setAge(20)
            Object invoke = setMethod.invoke(obj, 20);
            Object result = showMethod.invoke(obj);
            System.out.println("show私有"+result);
    

    1.8.3 main 方法与执行

    添加main方法
    在这里插入图片描述

    在这里插入图片描述

     //有参构造 , 并实例化
            Class<User> clazz = User.class;
            //2 获得方法 -- main 静态方法 -- public static void main(String[] args)
            Method mainMethod = clazz.getMethod("main", String[].class);
            Object getReturnObj =  mainMethod.invoke(null, (Object)new String[]{"aaa","bbb"});
            System.out.println("main 方法返回值:|||||||||" + getReturnObj);
    

    1.8.4 public 字段的操作

    在这里插入图片描述

    
      //5 操作字段,进行赋值,public String  name;
            //5.1 获得的字段,一个形参
            // * 格式:getField(字段名)
            Field descriptionField = clazz.getField("name");
            System.out.println("getField(字段名)     "+descriptionField);
    
            //5.2 为对象的字段赋值
            descriptionField.set(obj, "喜欢在文字中倾诉");
    
            //5.3 获取对象的字段值
            Object fieldReturnObj = descriptionField.get(obj);
            System.out.println("description 字段返回值:       "+fieldReturnObj);
    
    
    

    1.8.5 private 字段的操作

    在这里插入图片描述

    在这里插入图片描述

       //5 操作字段,进行赋值,private String  name;
            //5.1 获得的字段,一个形参
            // * 格式:getDeclaredField(字段名)
            Field descriptionField = clazz.getDeclaredField("name");
            System.out.println("getDeclaredField(字段名)     "+descriptionField);
            //暴力访问
            descriptionField.setAccessible(true);
            //5.2 为对象的字段赋值
            descriptionField.set(obj, "喜欢在文字中倾诉");
    
            //5.3 获取对象的字段值
            Object fieldReturnObj = descriptionField.get(obj);
            System.out.println("description 字段返回值:       "+fieldReturnObj);
    
    
    展开全文
  • 反射机制及其应用场景

    万次阅读 多人点赞 2018-04-28 00:21:44
    反射----1 反射机制 反射应用场景 Tomcat服务器1. Java的反射机制(1).反射和类的关系在程序运行状态中,对任意一个类(指的是.class文件),都能够知道这个类的所有的属性和方法。(2).反射和类对象的关系 反射...

     反射----1

         反射机制 反射的应用场景 Tomcat服务器

    1.   Java的反射机制

    (1).反射和类的关系

    在程序运行状态中,对任意一个(指的是.class文件),都能够知道这个类所有属性方法

    (2).反射和类对象的关系

          反射对于某个类的一个对象,都能够调用它的任意一个方法属性

    (3).Java反射机制(基于(1) 和 (2))

    [1]. 这种动态获取的信息以及动态地调用类对象的方法或者属性功能称为Java语言的反射机制。

    [2]. 通俗描述反射机制动态获取对象的信息就称为反射

    (4).Java反射机制的好处

    极大地提高了应用程序扩展性

    [1]. 通过多态提高程序的扩展性弊端

    反射以前提高程序的扩展性是通过多态:将子类对象传递给父类引用来实现的

    e.g. Animal ani =new Cat();

    【缺点】必须要通过new来建立子类对象。子类对象必须写死在代码中。

    [2]. 有了反射之后,可以通过反射技术省略掉new子类对象的一步

    直接将子类对象类名字符串的形式传递给反射技术框架由反射技术框架创建这个字符串代表的类的实例

    (5).反射的另类理解

    [1]. 反射就是把Java中的中的各个成分映射成相应的类

    [2]. 一个Java组成

    成员变量成员方法构造方法修饰符、包等。

    [3].Java中的一个指定的类中的每一个成员都可以用相应的Java反射类API一个实例来表示

    03.反射--01【反射机制】【反射的应用场景】【Tomcat服务器】

    2.   Java反射的应用场景

    1). 场景I

    (1).有应用程序,但没有源码

    一个做好应用程序没有源代码。但是现在客户端想为这个应用程序添加自己的新功能,怎么办?存在以下两个需要解决的问题:

    问题[1].也就是已经独立运行的App怎么识别客户端自定义的类?(因为App在开发的时候,并不知道客户端的自定义类是什么样子)

    问题[2].如果App有办法识别这个了客户端自定义的类,如何使用这个类的对象呢?(因为App的源码不能改变)

    (2).问题I的解决办法

    [1]. 通常一个应用程序为了扩展性,都会对外暴露一个接口

    [2]. 这个接口由想扩展软件功能的客户端进行实现,之后,该应用软件可以使用符合自己条件的接口的子类对象

    [3]. 以一个图的形式表现出来:

    03.反射--01【反射机制】【反射的应用场景】【Tomcat服务器】

    [4]. 解决完问题I,问题II产生了

    {1}. 客户端创建了实现了App提供的对外接口Inter的实现子类DemoImpl

    {2}. 出现的问题

    此时:客户端想把Inter in=new DemoImpl();加入到App中去。但是不能修改源码,那怎么能让App使用客户端建立的子对象呢?

    (3).问题II的解决办法

    [1]. 通常应用程序在对外暴露接口之外,还对外提供配置文件。提供了配置文件之后,便可以把客户端自己建立的并且符合标准的告知应用程序的App,而不用了解应用程序App里面是如何建立这个类的对象的。(从客户端的角度)

    [2]{1}. 应用程序App应该做的就是采用IO流技术读取配置文件。这样,应用程序App便了解到了客户端自定义的类是什么。

    [2]{2}. 然后应用程序App根据IO获取到的客户端自定义的类名字符串去寻找相应的.class类文件

    如图:

    03.反射--01【反射机制】【反射的应用场景】【Tomcat服务器】

    [2]{3}一旦App找到客户端自定义的类文件DemoImpl.class,App可以将其加载到内存中,并通过字节码文件建立对象【这一步使用到了Java的反射技术!!!】

    【分析为什么是反射机制】由于App一定是在客户端使用它之前编写成功,所以,App本身并不能知道未来客户端定义的类的名字,所以,一定是在运行时获取一个类的信息、获取这个类的对象并调用这个对象的有关方法,这便是Java反射机制的定义

    (4).如何为自行开发的软件提高可扩展性

    [1]. 编写软件的时候,要先通过反射技术去实现如何通过类名字符串获取该对象的实例,并且能进行方法调用

    [2]. 然后对外暴露符合自身软件规范接口

    [3]. 提供符合读写规则配置文件

    【知识点回顾】

    Hibernate如何识别用户自定义的实体文件?Struts2如何识别用户自定义的Action的子类文件?【都是通过反射技术来实现的】

    3.   反射机制的典型应用---Tomcat服务器

    1).Tomcat服务器应用到的Java的三大技术

    IO技术ServerSocket技术反射技术

    2).Tomcat服务器大致处理用户应答的思路

    (1).对外暴露接口---->著名的Servlet (服务器脚本片段)

    [1]. 对外提供接口的原因具体处理客户端应答请求的方式不一样的。应该根据具体的请求来进行具体的处理。向上抽取形成Servlet接口并提供给客户端使用。

    [2]. 由开发者来实现Servlet接口定义的具体应答请求的处理方式

    (2).提供配置文件---->web.xml (WEB宏观部署描述文件)

    每个Web应用程序都有自己的配置文件web.xml告知Tomcat服务器(App)有哪些用户自定义的Servlet实现类

    3).Tomcat具体加载处理细节

    (1). Tomcat(App)首先读取配置文件web.xml中配置好的Servlet的子类名称

    (2).Tomcat根据读取到的客户端实现的Servlet子类的类名字符串去寻找对应的字节码文件。如果找到就将其加载到内存。

    (3).Tomcat通过预先设置好的Java反射处理机制解析字节码文件并创建相应的实例对象。之后调用所需要的方法。

    【最后】Tomcat一启动,用户自定义的Servlet的子类通过Tomcat内部的反射框架也随之运行。

    4.   总结

    (1). 反射技术提高了应用程序的可扩展性

    (2). 反射技术应用起来非常简单。为用户和App之间提供可以交互的配置文件接口

    【用户面对配置文件的难度<<面对源代码的难度】

    (3). 反射一般是“接口+配置文件”这种开发形式十分常见

    (4). 学习框架技术要领学习框架的用途配置文件

    展开全文
  • java反射应用

    千次阅读 2019-04-08 17:07:44
    1.反射概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言...
  • 反射机制及应用场景

    2019-09-22 10:28:33
    应用场景:在第三方应用开发过程中,如果某一个类的方法属性是私有的,或者只对应用系统开放,可以通过反射机制获得自己所需要的信息。 实现方式:1)调用运行时类本身的.class属性 2)利用运行时类的...
  • 这个文档讲述了反射的原理,以及class的各方面的应用举一反三,全面深入的讲述了反射的机制以及巧妙应用
  • 反射应用场景

    千次阅读 2018-03-06 17:03:41
    反射机制提供了哪些功能?在运行时判定任意一个对象所属的类在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理;Java反射机制类:java....
  • 反射机制介绍 JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java ...
  • Golang反射机制的应用

    千次阅读 2018-10-16 14:55:39
    反射机制应用场景 反射常见应用场景有以下两种: 不知道接口调用哪个函数,根据传入参数在运行时确定调用的具体接口,这种需要对函数或方法反射。例如以下这种桥接模式: func bridge(funcPtr interface{}, ...
  • JAVA反射机制以及常见应用场景

    万次阅读 2020-04-22 22:29:01
    反射机制是JAVA的核心知识点之一,大多数框架的实现原理就是利用了反射机制,掌握反射机制会使你学习框架更加轻松高效 一、JAVA中的反射指的是什么? 回答上面这个问题的时候,我们先讨论下class的加载方式和流程 ...
  • 主要介绍了Android通过反射实现强制停止应用程序的方法,涉及Android的反射机制与进程操作的相关技巧,需要的朋友可以参考下
  • 本文是Java反射的一个常见的案例,常见的情况是,给到一个对象,需要把对象的每个属性和值重新生成一个Map或者Array,这个时候就是要要到反射啦,不多说,上干货: public static ArrayList&lt;NameValuePair&...
  • Java 反射在实际开发中的应用

    万次阅读 2018-09-25 10:28:23
    四: Java反射在实际开发中应用 4.1 :在web项目中创建统一的拦截层  4.2 : 用于webService服务 :和servlet做同意拦截,用反射去调用方法的目的一样(添加一些想要的处理,比如校验用户)。核心也是反射...
  • 今天带领大家详详细细的把反射好好说一遍,反射包含的东西还是非常多的,首先在这里准备了一些简单的代码,有个Model类库,数据访问层的DB.SqlServer类库,数据访问层接口DB.Interface类库,以及MyReflection的...
  • 本段代码是在学习了反射相关知识后,结合实际开发经验,以一个简单demo讲述开发中是如何利用发射进行开发。 主要包含以下三个知识点:1.以tomcat为例,讲述其基于反射运行的原理。2. 反射的三种实现方式--获取字节码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 286,614
精华内容 114,645
关键字:

反射的应用