在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总是指向当前函数的调用者。