反射机制(一)会用在哪些位置

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

  一:在运行时调用任意一个对象的方法——生成动态代理
  下面这行代码是在运行中换了调用的方法,实现了多态;

public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
		System.out.println("请输入实现Usb类名:按实现类名的方法执行");
		String cname=input.next(); //Udisk,keyborad,usb,cd.....	

		try {
			Class c= Class.forName("反射应用."+cname);//返回与带有给定字符串名的类或接口相关联的 Class 对象
			Usb usb=(Usb)c.newInstance();//确定此对象所表示的类或接口实现的接口。
			usb.work();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//实现多态
	   //Usb usb=new Udisk();  //比较硬编码
	   //usb.work();
 catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

   二:获取对应的运行时类的完整的类的结构:属性、方法、构造器、包、父类、接口、泛型、注解、异常、内部类。。

     //1.创建对象
        Object o=c.newInstance();
        //2.获取类的所有属性(Field)
        Field [] fields=c.getDeclaredFields();
        for (Field field : fields) {
            System.out.println("属性名是:"+field.getName());
        }
        //3.获取类中所有的方法
        Method []methods=c.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("方法名是:"+method.getName());
        }
        //4.属性赋值
        Field fname=c.getDeclaredField("name");
        fname.set(o, "张三");
        Field fage=c.getDeclaredField("age");
        fage.set(o, 21);

        //5.调用方法
        Method method=c.getDeclaredMethod("show", null);
        Object returnvalue=method.invoke(o, null);
        System.out.println("值是:"+returnvalue);

  三:调用对应的运行时类中指定的结构(某个指定的属性、方法、构造器)(重点)

 

//调用指定属性
@Test
public void test3() throws Exception{
    Class clazz = Class.forName("com.atguigu.review.Animal");
    Object obj = clazz.newInstance();
    Animal a = (Animal)obj;
    //调用非public的属性
    Field f1 = clazz.getDeclaredField("name");
    f1.setAccessible(true);
    f1.set(a, "Jerry");
    //调用public的属性
    Field f2 = clazz.getField("age");
    f2.set(a, 9);
    System.out.println(f2.get(a));
    System.out.println(a);
    //调用static的属性
    Field f3 = clazz.getDeclaredField("desc");
    System.out.println(f3.get(null));
}

//调用指定的方法
@Test
public void test4() throws Exception{
    Class clazz = Class.forName("com.atguigu.review.Animal");
    Object obj = clazz.newInstance();
    Animal a = (Animal)obj;

    //调用非public的方法
    Method m1 = clazz.getDeclaredMethod("getAge");
    m1.setAccessible(true);
    int age = (Integer)m1.invoke(a);
    System.out.println(age);
    //调用public的方法
    Method m2 = clazz.getMethod("show", String.class);
    Object returnVal = m2.invoke(a,"金毛");
    System.out.println(returnVal);
    //调用static的方法
    Method m3 = clazz.getDeclaredMethod("info");
    m3.setAccessible(true);
//        m3.invoke(Animal.class);
    m3.invoke(null);

}

总结:反射是反过来访问类的属性,方法......,我们程序员可以更灵活的写好业务功能。

  

时间: 2024-11-08 22:44:46

反射机制(一)会用在哪些位置的相关文章

【JDBC】使用JDBC连接Oracle数据库(JAVA反射机制)

db.properties文件 driverClassName=oracle.jdbc.OracleDriver url=jdbc:oracle:thin:@localhost:1521:xe username=system password=123456 db.properties JDBCUtilProperties.java文件 对数据连接和释放资源的封装, package com.xdl.util; import java.io.IOException; import java.io.I

Java语言的反射机制 笔记 摘自 http://blog.csdn.net/kaoa000/article/details/8453371

在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. 1.Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类.在运行时构造任意一个类的对象.在运行时判断任意一个类所具有的成员变量和方法.在运行时调用任意一个对象的方法 2.Reflection 是Java被视为动态(或准动态)语言的一个关键性质.

C#反射机制(转)

一:反射的定义 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码 System.Reflection.Assembly  System.Reflection.MemberInfo System.Reflection.EventInfo System.Reflection.Fie

黑马程序员_Java反射机制

一切的操作都将使用Object完成,类,数组的引用都可以使用Object来接收 1,认识Class类 以前要是想知道一个类中的属性,成员变量,方法等等的信息的话,需要通过new这个类的对象才能得到这些信息,但是在Java中,也允许一个实例化对象找到一个类的完整的信息,这个类就是Class类,Class类是继承Object类的. 正常方式:  引入需要的"包.类"名称 >取得实例化对象 反射方式:  实例化对象>得到完整的"包.类"名称 getClass(

深入理解Java类型信息(Class对象)与反射机制(干货)

[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/70768369 出自[zejian的博客] 本篇主要是深入对Java中的Class对象进行分析,这对后续深入理解反射技术非常重要,这篇有点偏向内功类文章,主要内容如下: 深入理解Class对象 RRTI的概念以及Class对象作用 Class对象的加载及其获取方式 Class对象的加载 ClassforName方法 Class字面常

Java反射机制深入研究

ava 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一个类的对象. 在运行时判断任意一个类所具有的成员变量和方法. 在运行时调用任意一个对象的方

反射机制、依赖注入、控制反转

反射机制 正向: 代码->dll, 先编码, 定义好类,通过实例化对象来调用之. 反向: dll->类[方法,属性]. 从已经有的dll文件反编译得到其中的一些可用的方法. 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码. 反射是.Net中获取 运行时类型信息的方式,.Ne

Java反射机制的学习

Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Java反射机制没啥用.或许在J2EE.J2SE等平台,Java反射机制没啥用(具体我也不了解,不多做评论),但是在Android应用开发中,该

C#_反射机制

一:反射的定义 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码 System.Reflection.Assembly  System.Reflection.MemberInfo System.Reflection.EventInfo System.Reflection.Fie