java中的反射机制及其它知识点

7 篇文章 0 订阅
反射是java提供的一种特殊处理机制,主要应用到框架开发中,常规用的不多。反射就是在运行状态中,对于任意一个类,可以访问类下的所有方法和属性。对于任意一个对象,都能调用它的任意一个方法。多有的都是动态获取的。

在java中,主要由以下几类实现反射机制:

Class类:表示一个类
Field类:表示类的属性
Method类:表示类的方法
Constructor:表示类的构造器

下图可以简单的说明这种关系。


1.clazz.getField("addr")中的getField方法只能获取到public类型的属性。而clazz.getDeclaredFields()则可以得到所有声明的属性。

2.构造反射类有三种方法。如TestBean是一个实体类。并且位于com.bjsxt.test包内。则有

①需放入try……catch中

Class clazz = Class.forName("com.bjsxt.test.TestBean");
②推荐第二种,简单

Class clazz = TestBean.class;
③分步

TestBean tb = new TestBean();
Class clazz = tb.getClass();
查看输出结果:
System.out.println(clazz.getName);//com.bjsxt.test.TestBean
System.out.println(clazz.getSimpleName);//TestBean
System.out.println(clazz.getPackage);//package com.bjsxt.test
3.invoke属于反射中Method类,主要是用来调用类中的方法。invoke(class,method)。
invoke是在不知道具体的类的情况下,根据配置的字符串去调用一个类的方法。
可以举个例子

import java.lang.reflect.Method;

public class InvokeTester {
    public int add(int param1, int param2) {
          return param1 + param2;
    }
 
    public String echo(String msg) {
 
          return "echo" + msg;
    }
    public static void main(String[] args) throws Exception {
          Class clazz = InvokeTester.class;
          Object obj = clazz.newInstance();
           
          Method addMethod = clazz.getMethod("add", new Class[] { int.class,int.class });
                     
//        Object result = addMethod.invoke(obj, new Object[] {new Integer(100), new Integer(200) });
          //在jdk5.0中有了装箱 拆箱机制 new Integer(100)可以用100来代替,系统会自动在int 和integer之间转换
          Object result = addMethod.invoke(obj, new Object[] {100, 200 });//两种写法效果相同

          System.out.println(result);
 
          Method echoMethod = clazz.getMethod("echo",new Class[] { String.class });
          result = echoMethod.invoke(obj, new Object[] { "hello"});
          System.out.println(result);
         }
}
结果为:

300
echohello
注意Method调用方法时的写法。

4.newInstance()和new有什么区别?

①newInstance()是Class的一个方法,而new是java的一个关键字。
②newInstance()的使用有局限,因为它生成对象只能调用无参的构造方法,而new生成对象时没有这个限制。用于反射。

因此在写实体类时,最好写上无参构造方法和有参的构造方法

Class.forName("");//返回的是类,
Class.forName("").newInstance();//返回的是object
5.setObject(int index,Object object)的用法
ps = conn.prepareStatement(sql);
ps.setObject(i+1,params[i]);//表示将数组param的第i个值赋给sql中的第i+1个问号,因为数据库中的下标从1开始。
还有类似的。

setString(1,"哈哈")表示给sql语句中的第一个"?"赋值为字符串"哈哈",类似的setInt(2,4)表示对sql语句的第二个“?”赋值为4

6.static修饰变量时,静态变量会不依赖于堆内存,而放置在静态存储区。
堆内存中存放new出来的对象和数组。静态存储区存放静态数据,全局变量还有常量。栈中存放函数内的变量,即局部变量,并且栈中的数据可以共享。

7.分页
mysql分页查询语句为:

select * from user limit startRow,pageSize;//startRow表示从数据库哪一行开始查。
如数据库有10条记录

select * from user limit 0,10;//出10条结果,并且从第一条记录开始
select * from user limit 1,10;//出9条结果,从第二条记录开始查
所以虽然数据库下标是从1开始,但还可以用0

8.父类的私有属性(private),实际上子类也可以继承,只是由于语法检查不能对私有属性进行访问,这时可以用设置setAccessiable("true")来访问私有属性。

9.将双线合并为一条单线,可以使用

style = "border-collapse:collapse"
10. 代码“${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。 如原路径为:

“/images/title.gif”,改为“${pageContext.request.contextPath}/images/title.gif”。

如新建了一个web project,名称为sxtwuye01 ,则使用${pageContext.request.contextPath }得到的名称为“/sxtwuye01”,包含斜杠

11.默认选中,<radio>可以用checked,<option>用selected

12.indexOf函数:查找字符串中指定字符或字符首次出现位置,并返回索引值。若找到索引值,就返回索引值位置;找不到就返回-1。


从0开始数。如果有重复的字符出现,以第一个字符为准。

if(url.indexOf("?")!=-1){}//判断url中是否包含"?",若url.indexOf("?")!=-1,说明包含"?".所以既使?出现在第一位,即indexOf后为0,也会继续执行

13.this:在java中式指向当前对象。在javascript总是指向当前函数的调用者。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值