反射

什么是反射?

我看了一些说反射的 大概的意思就是 反射就是把一个对象的所有属性和方法都映射成一个对象。

我就大体找了一下比较常用的方法 获取属性 获取方法

一. 获取 Class 对象

1.Object  o=new Object;

  Class c1= o.getClass;

2.Class c1=Object.getClass;

3.Class c1=Class.forName("com.xlj.Student");
   ( package:com/xlj/Student ) forName里面的参数写的全部的包下的全部地址
二.获取 class 的属性
1.获取单个属性

    1)只可以获取到 public 修饰属性

    File file=c1.getField("name")

  2)获取属性没有权限的限制

   File file =c1.getDeclaredField("id");
2.获取多个属性

    1)只可以获取到 public 修饰属性   

   Field[] files = c1.getFields();
  2)获取到全部的属性   
   Field[] files = c1.getDeclaredFields();
三.获取 class 的方法
1.获取单个方法

      1)只可以获取到 public 修饰的方法

  Method method=c1.getMethod("show", String.class);
  show 是要获取的方法名称 String 是传入的参数

     2)获取方法没有权限限制

  Method method=c1.getDeclaredMethod("show", String.class);

2.获取多个方法

   1)只可以获取到 public 修饰的方法

  Method[] methods=c1.getMethods();

   2)获取方法没有权限限制

  Method[] methods=c1.getDeclaredMethods();

//用一个正则表达式去约束获取
String reg = "^get*";
Pattern r = Pattern.compile(reg);
Matcher matcher = r.matcher(method.getName());
四.解除私有限定
1.me thod.setAccessible(true);
 
五.获取和设置属性的信息(如果是私有属性赋值时需要解锁私有限定)

1.获取属性名
Field[] files = c1.getDeclaredFields();//获取全部属性
for(Field file :files)//遍历全部属性
{
    file.getName(); //获取属性名称
}
2.获取属性的类型
Field file = c1.getDeclaredField("id");//获取属性名为 id 的属性
file.getType();//获取属性的类型
3.获取对象的属性的值
//创建一个方法获来获取传入对象id属性的值
public void getObjectByID(Object object){
Class c=object.getClass();//获去对象
Field field=c.getDeclaredField("id");//获取属性名为id的属性
field.get(object);//获取 id 属性的值
}
4.设置对象的属性的值

//创建一个方法获来设置传入对象id属性的值
public void getObjectByID(Object object){
Class c=object.getClass();//获去对象
Field field=c.getDeclaredField("id");//获取属性名为id的属性
field.setAccessible(true)//如果是私有的属性需要解除私有的权限
field.set(object,"12");//给 id 属性的赋值
}

五.实例Object1 给 Object2属性名相同的属性赋值

方法一:

//o1是赋值方,o2是被赋值方
private void copy(Object o1,Object o2){
    //获取对象运行时类,实际对象类
    Class c1=o1.getClass();
    //获取所有属性,包括私有的.不包括继承父类的?
    Field[] fieldArray1=c1.getDeclaredFields();
    Class c2=o2.getClass();
    Field[] fieldArray2=c2.getDeclaredFields();

    //循环寻找对应属性
    for (Field field1:fieldArray1
            ) {
        for (Field field2:fieldArray2
                ) {
            //属性类型及属性名判断相等
            if (field1.getName().equals(field2.getName())&&field1.getType().equals(field2.getType())){
                //解除私有限定
                field1.setAccessible(true);
                field2.setAccessible(true);
                try {
                    //传入要改变属性值的对象,传入要获取属性值的对象
                    field2.set(o2, field1.get(o1));
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}
方法二:
public class EntityUtils {

    public static Object AtoB(Object a, Object b) {

        Class classA = a.getClass();
        Class classB = b.getClass();
        // 将A的get方法封装为map,key是set方法名字 value是get字段名字
        Map<String, Method> amap = new HashMap();
        Method[] amethods = classA.getMethods();
        try {
            for (Method m : amethods) {
                String reg = "^get*";
                // 创建 Pattern 对象
                Pattern r = Pattern.compile(reg);
                Matcher matcher = r.matcher(m.getName());
                if (matcher.find()) {
                    TableField annotation = m.getAnnotation(TableField.class);
                    if (annotation != null) {
                        continue;
                    }
                    String sub = m.getName().substring(3, m.getName().length());
                    amap.put("set" + sub, m);
                }
            }
            // 获取B的set方法
            Method[] bmethods = classB.getMethods();
            for (Method m : bmethods) {
                if (m.getName().equals("getClass")) {
                    continue;
                }
                Method am = amap.get(m.getName());
                if (am != null) {
                    Object o;

                    o = am.invoke(a);

                    if (o == null) {
                        continue;
                    }
                    m.invoke(b, o);
                }

            }
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return b;
    }
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        b = (B) EntityUtils.AtoB(a, b);
        System.out.println(b.getName() + "," + b.getType());
    }

}

原文链接-敬业的小码哥

感谢博主 敬业的小码哥


内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值