1.1、项目中建立一个lib目录
1.2、把jar包复制到lib目录下。
1.3、选中所有的jar包,右键在选择Build Path 》》 add to Build Path
//通过日志工厂类获得日志对象
protected static final Log log = LogFactory.getLog(Login.class);
JAVA反射机制主要提供了以下功能:
1、在运行期判断任意一个对象所属的类。
2、在运行期构造任意一个类的对象。
3、在运行期判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)。
4、在运行期调用任意一个对象的方法
package com.log;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import pojo.Student;
public class FieldStu {
public static void main(String[] args) throws InvocationTargetException {
try {
//通过反射加载一个类
Class clazz = Class.forName("pojo.Student");
System.out.println(clazz.getName());
System.out.println(clazz.getSimpleName());
System.out.println(clazz.getCanonicalName());
System.out.println(clazz.getModifiers());
//通过反射方法构造一个对象
Object object = clazz.newInstance();
//Student student = (Student)clazz.newInstance();
//System.out.println("======"+student.getName());
//只能获得public属性
//Field[] fields = clazz.getFields();
//可以获得全部属性
Field[] fields = clazz.getDeclaredFields();
//Field field = clazz.getField(age);
System.out.println(fields.length);
for(Field f:fields){
System.out.println(f.getName());
System.out.println(f.getModifiers());
System.out.println(f.getType());
}
System.out.println();
//获得构造方法
Constructor[] constructors = clazz.getDeclaredConstructors();
for(Constructor c:constructors){
System.out.println(c.getName());
}
System.out.println(constructors.length);
//获得普通方法
Method[] methods = clazz.getMethods();
System.out.println(methods.length);
System.out.println();
for(Method m:methods){
//System.out.println(m.getName());
if(m.getModifiers()==Modifier.PUBLIC){
System.out.println(m.getName());
//
// Object o = m.invoke(m, args);
// System.out.println(o.toString());
}
}
Method method = clazz.getMethod("setName", String.class);
System.out.println(method.getName());
System.out.println(method.getReturnType());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
枚举类型主要提供固定的、规范化的一些常数(public static final),是一种自定义的基本数据类型,当我们需要声明一组命名的常数,而且这个变量只有几种可能的取值时,那么就可以将它定义为枚举类型。
public enum Enum {
SUSPENSION(0),GOSCHOOL(1),OUTSCHOOL(2);
public int num;
Enum(int num){
this.num = num;
}
}
SUSPENSION(0),GOSCHOOL(1),OUTSCHOOL(2);这三个分别调用下面的构造方法
我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如JavaBean传递时采用的是引用传递,而很多时候对于对象传递我们也希望能够象值传递一样,使得传递之前和之后有不同的内存空间,这就是对象的克隆:一个新的对象和一个新的对象数据空间。
要实现对象的克隆我们需要完成按照以下几个步骤,然后调用clone()方法实现克隆。
1、可以利用Object类的clone()方法。实现Cloneable接口。
2、在派生类中覆盖基类的clone(),最好修改访问修饰符为public。
2、在派生类的clone()方法中,调用super.clone()。
public Object clone() {
// TODO Auto-generated method stub
// Student student = null;
// try {
// student = (Student)super.clone();
// } catch (CloneNotSupportedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return object;
}
Run类中的main方法通过调用clone()完成克隆
public static void main(String[] args) {
Student student1 = new Student();
student1.setName("lin");
Student student2 = (Student)student1.clone();
student2.setName("sen");
System.out.println(student1.getName());
}
2、深度克隆
当student类中的属性有有一个对象,该对象不会克隆,要想实现克隆,该对象的实现类也要实现克隆
创建一个大学生类,实现克隆
public class College implements Cloneable{
private String profession;
public String getProfession() {
return profession;
}
public void setProfession(String profession) {
this.profession = profession;
}
@Override
public Object clone() {
// TODO Auto-generated method stub
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return object;
}
}
在学生类的克隆方法中实现大学生类的克隆
public Object clone() {
Student student = null;
try {
student = (Student)super.clone();
College college = (College)student.getColleage().clone();
student.setColleage(college);
return student;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
在main方法中检测
public static void main(String[] args) {
Student student1 = new Student();
College college = new College();
//设置student1中的内容
college.setProfession("程序员");
student1.setColleage(college);
student1.setName("lin");
System.out.println(student1.getColleage().getProfession());
//克隆student1
Student student2 = (Student)student1.clone();
//修改student2中的内容
student2.getColleage().setProfession("工程师");
student2.setName("sen");
System.out.println(student1.getName()+student1.getColleage().getProfession());
System.out.println(student2.getName()+student2.getColleage().getProfession());
}