Java 反射的总结

什么是Java 反射(reflect)

Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection API取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

Java反射机制允许程序在运行时加载、探知、使用编译期间完全未知的classes。

换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构

如果实现类的Reflect 呢?

通过类的Class 对象。 运行时类想引入其他类对象 这时就要使用类的Class对象。如何获取类的Class对象呢? 有四种方法,常用的三种

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
/**
 * @param args
 */
public static void main(String[] args) {
Class c;
try {
// 获取类的Class对象有三种方式 其实也就是获取Reflect
// 第一种方式 使用静态方法 forName
c = Class.forName("User");
// 第二种方法
// c = User.class;
 //第三种方法
// User user = new User();
// c = user.getClass();
Object obj = c.newInstance();
Method m1=c.getMethod("say");//找到名字叫做say、且无参的方法
        Method m2=c.getMethod("say",String.class);//找到名字叫做say、且有一个String类型参数的方法
        Method m3=c.getMethod("setName",String.class);
        Method m4=c.getMethod("getName");
        m3.invoke(obj, "zlm");
        m4.invoke(obj);
        m1.invoke(obj);//注意newInstance()调用的是无参的构造方法!!!
        
        m2.invoke(c.getConstructor(String.class).newInstance("zlm"),"哈哈");//通过有参的构造方法实例化一个对象
        
        System.out.println("-----------------------------------获取Reflect属性-------------------------");
       // c.getField("name");
        Object object = c.newInstance(); // 这是本例的事例对象
        c.getField("pas").set(object, "zlmwin");
      Field field =  c.getDeclaredField("name");
      field.setAccessible(true);
      field.set(object, "win0701");
        System.out.println(field.get(object));
        System.out.println(c.getField("pas"));
        System.out.println(c.getField("pas").get(object));
        Field[] field1 = c.getFields();
        for(Field fi:field1){
        System.out.println("============fi========>" + fi);
        }
        
        Field[] field2 = c.getDeclaredFields();
        for(Field fe:field2){
        System.out.println("-=-=-=-=-=-=fe-=-=-=-=-=<>" + fe);
        System.out.println("-------------------赋值开始----------------" + fe.toString().trim().startsWith("public", 0));
        if(fe.toString().startsWith("public", 0)){
        System.out.println("99999999999999");
        fe.set(object, "public");
        System.out.println(fe.get(object));
        }else{
        
        fe.setAccessible(true);
        fe.set(object, "private");
        System.out.println(fe.get(object));
        }
        System.out.println("-------------------赋值结束----------------");
        System.out.println("==================================Field测试结束====================");
        System.out.println("==================================方法 test start====================");
//        //Method me = c.getMethod("info");
//        //Method me = c.getMethod("login", String.class);
//        Method me = c.getDeclaredMethod("login", String.class);
//        me.setAccessible(true);
//        me.invoke(object, "小丁");
//        System.out.println("-----------------------------");
//        Method[] me1 = c.getMethods();
//        for(Method mh:me1){
//        System.out.println("---???--->" + mh + "----" + mh.hashCode());
//        
//        }
//        Method method = c.getMethod("getName");
//        method.invoke(object);
        
        }
        System.out.println("----------------构造方法----------------------");
        Constructor con = c.getConstructor(String.class);
        c.newInstance();
        User user= (User)con.newInstance("小丁丁");
        user.say();
        user.say("liming");
        System.out.println("ppppppp......" + con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//通过反射找到对应的类
}
}

User 类

class User
{
    private String name;
    public String pas;
    
    public static String id;
    
    public void setName(String name){
    
    this.name = name;
    System.out.println("-----------"+this.name);
    }
    public String getName(){
    System.out.println("---+--------"+this.name);
    return this.name;
    }
    public User(){ 
    System.out.println("无参构造方法");
    }
    public User(String name)
    {
        System.out.println("----------------============" + name);
    this.name=name;
    }
    public void say()//无参的方法
    {
        System.out.println("大家好,我叫"+this.name+"!");
    }
    public void say(String str)//有参的方法
    {
        System.out.println("大家好,我叫"+name+"!"+str+",我是有参的方法!");
    }
    
    @SuppressWarnings("unused")
private void login(String name){
    this.name = name;
    System.out.println("私有方法---------------->" + name);
    }
    
    public static void info(){
    System.out.println("静态方法");
    }
}
时间: 2024-10-17 05:51:14

Java 反射的总结的相关文章

Java反射

1. 介绍 反射是一种能够在程序运行时动态访问.修改某个类中任意属性和方法的机制. 具体:对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性 在运行时,当加载完类之后,JVM在堆内存中会自动产生一个Class类型的对象,这个对象包含了完整的类的结构信息 这个Class对象就像一面镜子,透过这个镜子看到类的结构 那么,如何得到这个Class对象呢?以下可否 Class c = new Class(); 答案是不行的,因为Class的构造函数定义为私有

Java 反射详解

反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性.而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

java 反射 详解

本文来自:blog.csdn.net/ljphhj JAVA反射机制:   通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没用,下面我们看看实践 Demo - Demo: package cn.lee.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

java 反射类的理解与应用

本文主要解析的类是: ClassLodaer,Class,Field,Method,Constructor. 本文的目标很简单,只是对这些常用的反射类进行简单解释.对这些类中常用方法进行介绍. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的

Java 反射,开发框架必备技能

通过反射技术我们将上面的统一资源定位付(URL) 映射到Class 相当于 class: news method: list parameter: 2 差不多就是下面样子 class News{ public String list(String catagory_id){ ... ... } } 我们只需要在框架核心中分析 url 然后调用对应的方法下载,于此同时将参数传递过去. Class<?> cls = Class.forName("cn.netkiller.reflect.

Java反射与代理

Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC.AOP就是通过反射机制与动态代理实现的. 1       Java反射 示例: User user = new User(); user.setTime5Flag("test"); Class<?> cls = Class.forName("com.test.User"); //接口必须public,无论是否在本类内部使用!或者使用cls.getDeclaredMethod()

Java反射机制浅析

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用