zoukankan      html  css  js  c++  java
  • 反射机制

    先建立一个Person类,然后使用反射的一些方法获取Person类的属性和方法
    Class<Person> clazz=Person.class;
    Person p=clazz.newInstance();

    Field f=clazz.getField("name");//反射获取属性
    Field f1=clazz.getField("age");

    f.set(p, "卷发送到");
    f1.set(p, 1231423);
    System.out.println(p);

    //反射获取方法
    Method m1=clazz.getMethod("show");//无参数方法
    m1.invoke(p);

    Method m2=clazz.getMethod("show", String.class);//有参数的方法
    m2.invoke(p, "fjasldjfk");
    8.11
    反射里面获取私有的指定的属性
    Field ff=clazz.getDeclaredField("age");//获取指定的属性
    ff.setAccessible(true);//把私有的age设置为可访问的
    ff.set(p, 321);
    System.out.println(p);

    反射里面获取私有的指定的构造器并赋值
    Class clazz=Person.class;
    Constructor con=clazz.getDeclaredConstructor(String.class,int.class);//获取带有两个参数的构造方法
    con.setAccessible(true);//设置为可访问的
    Person p=(Person)con.newInstance("jiajia",78);获取可运行时类的构造方法
    System.out.println(p);

    ---------------------------------------------------------

    例子:

    Person类

    package com.lanqiao.javatest;

    public class Person {
    private String name;
    private int age;

    public Person() {
    super();
    }
    private Person(String name) {
    super();
    this.name = name;
    }
    public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
    }

    public void show(){
    System.out.println("java反射练习题!!");
    }

    public void show(String vation){
    System.out.println("java"+vation);
    }

    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;
    }

    @Override
    public String toString() {
    return "Person [name=" + name + ", age=" + age + "]";
    }

    }

    反射的测试方法:

    1.

    package com.lanqiao.javatest;

    import java.lang.reflect.Constructor;

    import javax.swing.SpringLayout.Constraints;

    public class Test2 {

    public static void main(String[] args) throws Exception {
    //获取指定的构造器方法
    // 方法一
    // String className="com.lanqiao.javatest.Person";
    // @SuppressWarnings("rawtypes")
    // Class clazz=Class.forName(className);

    Class clazz=Person.class;
    Constructor con=clazz.getDeclaredConstructor(String.class,int.class);
    con.setAccessible(true);
    Person p=(Person)con.newInstance("jiajia",78);
    System.out.println(p);
    }
    }

    2.

    package com.lanqiao.javatest;

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

    /*
    * Class是java.long.Class包中的;
    * */
    public class Test1 {

    public static void main(String[] args) throws Exception {
    Class clazz=Person.class;
    Person p=(Person) clazz.newInstance();

    Field [] field=clazz.getFields();//获取全部属性


    Field ff=clazz.getDeclaredField("age");//获取指定的属性
    ff.setAccessible(true);//把私有的age设置为可访问的
    ff.set(p, 321);
    System.out.println(p);

    System.out.println();
    for(Field f:field){

    System.out.println(f.getType());//获取属性的类型
    System.out.println(f.getName());//获取属性的名字
    }

    System.out.println();
    Method[] method=clazz.getDeclaredMethods();//获取全部方法
    for(Method m:method){
    System.out.println(m.getName());
    }

    System.out.println();
    Method method1=clazz.getDeclaredMethod("show",String.class);//获取指定方法
    method1.invoke(p, "show");
    }

    }

  • 相关阅读:
    BZOJ3105:[CQOI2013]新Nim游戏(线性基,贪心)
    BZOJ5102:[POI2018]Prawnicy(贪心,堆)
    BZOJ3533:[SDOI2014]向量集(线段树,三分,凸包)
    BZOJ3569:DZY Loves Chinese II(线性基)
    BZOJ3534:[SDOI2014]重建(矩阵树定理)
    【BZOJ 1202】 [HNOI2005]狡猾的商人
    【BZOJ 1003】 [ZJOI2006]物流运输trans
    【BZOJ 2321】 [BeiJing2011集训]星器
    【BZOJ 1010】 [HNOI2008]玩具装箱toy
    【BZOJ 2730】 [HNOI2012]矿场搭建
  • 原文地址:https://www.cnblogs.com/lxnlxn/p/5764355.html
Copyright © 2011-2022 走看看