利用反射机制创建类的对象

第一步:创建要反射的类的字节码文件对象,其实就是创建了Class类的对象(一共有三种方法)

方式一:通过对对象获取字节码文件对象

例如:Person p = new Person();

    Class c1 = p.getclass();  //Object类中的方法:public final Class<?> getClass()返回此 Object 的运行时类。

方式二:任意数据类型都具备一个class静态属性.

    Class c2 = Person.class;

方式三:调用Class类中的静态方法forName()方法

Class c3 = class.forName("包名+类名");

第二步:获取类中的属性和方法的对象,要谁反射谁的对象.

    例如:看看构造方法有哪些,挑一个来用用.看看Class类给我们提供了哪些方法?

    public Constructor<?>[] getConstructors()throws SecurityException

    返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

    就是获取该字节码文件对象的所有公共的构造方法

    public Constructor<T> getConstructor(Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException

    返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。parameterTypes 参数是 Class 对象的一个数组

    其实就是构造方法对象,通过该对象可以访问Constructor 类中的方法

第三步:通过Constructor类中的newInstance()方法创建我们要反射的类的对象.

package lianxi1;

public class Yordles
{
    public String name;
    public int age;
    public String sex;
    public Yordles()
    {
        super();
    }
    public Yordles(String name)
    {
        super();
        this.name = name;
    }
    public Yordles(String name, int age, String sex)
    {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    @Override
    public String toString()
    {
        return "Yordles [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    }

}

package lianxi1;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Demo1
{
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, Exception
    {   //创建Yordles类的字节码文件对象
        Class<Yordles> yd = Yordles.class;
        //调用Class类的方法,获取Yordles类构造方法对象的数组
           Constructor[] constructors = yd.getConstructors();
           //遍历数组
           for (Constructor constructor : constructors)
        {   //看看Yordles类中都有哪些构造方法
            System.out.println(constructor);
            /* 打印结果为:publiclianxi1.Yordles(java.lang.String,int,java.lang.String)
              public lianxi1.Yordles(java.lang.String)
              public lianxi1.Yordles()
              */

        }   //parameterTypes表示成员变量的类型,这里获取一个参的构造方法对象
           Constructor<Yordles> c = yd.getConstructor(String.class);
           //创建Yordles类对象,并赋值一个名字
           Yordles yordle = c.newInstance("迅捷斥候");
           //打印结果为:Yordles [name=迅捷斥候, age=0, sex=null]
           System.out.println(yordle);

    }
}

如果要反射普通方法

public Method[] getMethods() throws SecurityException 获取所有公共的方法,包括继承的方法
 public Method[] getDeclaredMethods() throws SecurityException 获取所有声明的方法
 public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
throws NoSuchMethodException,SecurityException
name:方法名称 parameterTypes:参数的类型

Method:
public Object invoke(Object obj, Object... args) 执行方法
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
obj:我要执行哪个对象的方法 args:方法的参数

如果要反射成员属性

public Field getField(String name) 获取某个公共属性
throws NoSuchFieldException,
SecurityException

public Field getDeclaredField(String name) 获取某个声明属性
throws NoSuchFieldException,
SecurityException

Field:字段类
public void set(Object obj, Object value) 为指定对象的指定字段赋值
throws IllegalArgumentException,
IllegalAccessException

obj:要赋值字段的对象 value:赋成的新值

时间: 2024-10-23 13:31:38

利用反射机制创建类的对象的相关文章

php利用反射机制查找类和方法的所在位置

//参数1是类名,参数2是方法名 $func = new ReflectionMethod('UnifiedOrder_pub', 'getPrepayId'); //从第几行开始 $start = $func->getStartLine() - 1; //从第几行结束 $end = $func->getEndLine() - 1; //获取路径地址 $filename = $func->getFileName(); 下面是摘抄的示例代码比较全面 <?php //摘自:http:/

利用反射机制,获取类的字段、方法、并实现简单调用

这篇文章是为之后要介绍Android的ICO框架做预备的,所以,如果想最近学习Android的ICO框架的同学,可以稍微看一下. 首先,简单介绍一下Java里面的反射. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 不知道这样的一段解释,你能否看懂.如果更简单的说,反射就是能够根据你给出类名实例化出一个实实在在的对象.所以,对象的实例

Android利用反射机制为实体类属性赋值

在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面是在我在android中如何利用java反射机制给实体类赋值. 在Android中利用反射机制为实体类属性赋值,首先需要导入一下两个包 import java.lang.reflect.Field; import java.lang.reflect.Method; 给实体类赋值首先需要一个实体类,这

利用反射机制,对对象的属性值进行自动设置

import java.lang.reflect.Method; /** * 对象的属性值自动设置,利用反射机制 */ public class AutoSet { /** * 将源对象的属性值赋值到目标对象,属性名一致,且源对象有get方法,目标对象有set方法 * @param src 源对象 * @param target 目标对象 * @return 赋值后的目标对象 */ public static Object autoGetterAndSetter(Object src, Obje

利用Java反射机制完成XML到对象的解析

对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hashtable,那就能大大加快访问的速度. 由于工作的需要,写了一个解析工具,将XML解析成相应的对象列表.以下是源代码,希望对大家有所帮助,更希望大家帮我来改进这个工具. package com.sp.util; /* * author:hingwu * email:[email protected]

Java反射机制(创建Class对象的三种方式)

1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Modifier 2:什么是反射 JAVA反射机制是在运行状态中,对于任意一个类.都能都知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称

利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理

利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论:0 | 浏览:45 | 该类在MVC中可以方便管理配置信息,可以直接把Model储存进数据库或者从数据库去除数据转为Model. 1 何为配置项目? 比如网站的名称,页脚信息,meta中的KeyWord信息等,如果不想硬编码到网页里,就需要使用配置文件进行储存,通常都是储存到数据库中.使用的时候读取出来

java利用反射机制判断对象的属性是否为空

java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String>(); validateMap.put("serial", "编号");validateMap.put("major", "专业"); public static <T> String validateFiledIs

利用反射机制动态的调用类信息

public class reflectTest { /** * 利用反射设置实体类的属性 * * @return * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException * @throws NoSuchFieldException * @throws SecurityException * @throws NoSuchMethodException *