Equals方法
Object类中的equals方法用于检测一个对象是否等于另一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用,如果有相同引用,那么它们一定的相等的。但一般,我们经常需要检测两个对象的状态(值)是否相等,单纯判断两个对象是否相等意义不大,下面是一个完美的equals方法:
1.参数为otherObject
2.if(this == otherObject) return true;
3.if(otherObject == null) return false;
4.if(getClass() != otherObject.getClass()) return false;
5.if(!(otherObject instanceOf ClassName)) return false;
6.将otherObject转换为相应的类型
ClassName other = (ClassName)otherObject;
7.现在开始对要比较的域进行比较了,基本类型用==比较,对象用equals比较。
Equals与hashCode的定义必须一致,如果a.equals(b) return true;那么a.hashCode 必须与 b.hashCode有相同的值。
ToString方法:
Object中的重要方法,返回对象的字符串值,下面是toString的通用方法(java核心技术引用)
public class ObjectAnalyzer {
private ArrayList<Object> visited = new ArrayList<Object>();
public String toString(Object obj) {
if (obj == null)
return "null";
if (visited.contains(obj))
return "...";
visited.add(obj);
Class cl = obj.getClass();
if (cl == String.class)
return (String) obj;
if (cl.isArray()) {
String r = cl.getComponentType() + "[]{";
for (int i = 0; i < Array.getLength(obj); i++) {
if (i > 0)
r += ",";
Object val = Array.get(obj, i);
if (cl.getComponentType().isPrimitive())//是否是基本类型
r += val;
else
r += toString(val);
}
return r + "}";
}
String r = cl.getName();
do {
r += "[";
Field[] fields = cl.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);//可以访问对象的私有域
for (Field f : fields) {
if (!Modifier.isStatic(f.getModifiers())) {
if (!r.endsWith("["))
r += ",";
r += f.getName() + "=";
try {
Class t = f.getType();
Object val = f.get(obj);
if (t.isPrimitive())
r += val;
else
r += toString(val);
} catch (Exception e) {
e.printStackTrace();
}
}
}
r += "]";
cl = cl.getSuperclass();
} while (cl != null);
return r;
}
}
反射:
1.在运行中分析类的能力
2.在运行中查看对象
3.实现数组的操作代码
4.利用Method对象
5.查看类的结构等等
一.Class类
1. Class类保存每个对象所属的类
足迹
Object o2 = new ArrayReflect();
Class o = ArrayReflect.class;
System.out.println(o == o2.getClass());
结果 :true
2. 获得Class类的三种方式
(1)
Object obj1 = new Object();
Class cl1 = obj1.getClass();
(2)
Class cl2 = Class.forName(" java.lang.Object");
一般forName与newInstance配合使用,创建一个对象
Object object = Class.forName(" java.lang.Object").newInstance();
(3)一个Class对象实际上表示的是一个类型,而这个类型未必一定是一种类
Class cl3 = Object.class;
Class cl4 = int.class;
Class cl5 = Object[].class;
3.利用反射分析类的能力
java.lang.reflect包中有三个类Field、Method、Constructor分别用于描述类的域、方法、构造器。三个类中都有getName方法,用于返回项目的名称;getModifiers方法,返回一个整型数值,用于描述public和static这样的修饰符的使用状况,可以用Modifier.toString(f.getModifiers()),来分析整型数值的情况。
Calss类中的getFields、getMethods、getConstructors方法将分析返回类提供的public域
、方法和构造器数组,其中包括父类的公有成员
。Class类中的getDeclaredFields、getConstructors、getDeclaredMethods方法将分析返回类中的全部域
、方法和构造器,其中包括private、protected成员,但是不包括父类的成员
。
下面是输出类中全部域名,构造器和方法的代码:
public static void main(String[] args) {
try {
Class cl = Class.forName("java.lang.Double");
String modifiers = Modifier.toString(cl.getModifiers());
System.out.println("modifiers = " + modifiers);//修饰符
System.out.println("name = " + cl.getName());//名称
System.out.println("super name = " + cl.getSuperclass().getName());//父类名称
System.out.println();
// 域
Field[] field = cl.getDeclaredFields();
for (Field f : field) {
System.out.println("field modifiers = "
+ Modifier.toString(f.getModifiers()));//修饰符
System.out.println("field type = " + f.getType());//类型
System.out.println("field name = " + f.getName());//名称
}
System.out.println();
// 构造器
Constructor[] constructor = cl.getConstructors();
for (Constructor c : constructor) {
System.out.println("constructor modifiers = "
+ Modifier.toString(c.getModifiers()));//修饰符
System.out.println("constructor name = " + c.getName());//名称
Class[] params = c.getParameterTypes();
for (Class p : params) {
System.out.println("constructor paramsName = "
+ p.getName());//参数
}
}
System.out.println();
// 方法
Method[] method = cl.getDeclaredMethods();
for (Method m : method) {
System.out.println("method modifiers = "
+ Modifier.toString(m.getModifiers()));//修饰符
System.out.println("method returnType = " + m.getReturnType());//返回类型
System.out.println("method name = " + m.getName());//名称
Class[] methodParams = m.getParameterTypes();
for (Class mp : methodParams) {
System.out.println("method params = " + mp.getName());//参数
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
4.在运行时使用反射分析对象
利用反射,在运行进访问私有域,AccessibleObject.setAccessible(数组, true); 使用java程序不受到安全管理器的控制,这样就可以访问private的内容了
public class Test {
public static void main(String[] args) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {
ReflectA reflectA = new ReflectA("张三", 10);
Class cl = reflectA.getClass();
Field[] field = cl.getDeclaredFields();
// 使用java程序不受到安全管理器的控制,这样就可以访问private的内容了
AccessibleObject.setAccessible(field, true);
for (Field f : field) {
if ("name".equals(f.getName())) {
Object obj = f.get(reflectA);
System.out.println("obj:" + obj.toString());
}
}
}
}
public class ReflectA {
private String name;
public int age;
public static String address;
public ReflectA(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void hello() {
System.out.println("hello~~~~");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5.通用的数组扩展长度方法
public class ArrayReflect {
public Object arrayGrow(Object t) {
// 返回值声明为Object类型,而不声明为对象型数组Object[],基本类型数组可以转换成Object,但不能转换成对象数组。
Class cl = t.getClass();
if (!cl.isArray())
return null;
// 基本类型
Class componentType = cl.getComponentType();
int length = Array.getLength(t);
int newLength = length + 10;
// 构造新数组,componentType数组类型,newLength新数组长度
Object newArray = Array.newInstance(componentType, newLength);
// arraycopy方法可以扩展任意类型的数组,不仅是对象数组
System.arraycopy(t, 0, newArray, 0, length);
return newArray;
}
/**
* @param args
*/
public static void main(String[] args) {
Object o2 = new ArrayReflect();
Class o = ArrayReflect.class;
System.out.println(o == o2.getClass());
// TODO Auto-generated method stub
int[] oldArray = { 1, 2, 3, 4, 5 };
Object newArray = new ArrayReflect().arrayGrow(oldArray);
System.out.print(newArray.getClass().getComponentType().getName()
+ "[" + Array.getLength(newArray) + "] = {");
for (int i = 0; i < Array.getLength(newArray); i++) {
System.out.print(Array.get(newArray, i) + " ");
}
System.out.println("}");
}
}
结果:
int[15] = {1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 }
分享到:
相关推荐
在Java中,所有数组都继承自Object类,这意味着数组对象可以调用Object类的方法,如equals()和toString()。通过反射,我们可以获取数组的类信息,包括元素类型、长度等。Class类的isArray()方法用于判断是否为数组...
- Object类:所有Java类的基类,包含所有对象共有的方法,如equals()、hashCode()和toString()。 4. 反射的应用示例: 以下代码展示了如何使用反射获取并操作类A的信息: ```java Class<?> clazz = Class.forName(...
if (info.Name.Equals("UserName")) { info.SetValue(obj, "测试", null); } } return sb.ToString(); } } } ``` 在ASP.NET的网页(如Default.aspx)中,我们可以创建一个`Student`实例,并调用`...
例如,Lombok库使用注解处理器在编译时自动添加getter、setter、equals、hashCode和toString方法,而MyBatis框架允许开发者通过注解定义SQL语句,这些语句在运行时通过反射被解析并执行。 总的来说,注解和反射是...
Method method = c1.getMethod("toString", new Class[]{}); ``` - **获取字段** ```java Field field = c1.getField("length"); ``` - **获取类名** ```java String className = c1.getName(); ``` - **...
- Object类:所有Java类的基类,提供了诸如equals()、hashCode()和toString()等通用方法。 4. Java反射能做什么: 通过反射,Java程序可以实现以下功能: - 动态创建对象:通过Constructor类获取构造器并调用new...
- **Object类**:所有Java类的基类,提供了如equals()、hashCode()和toString()等通用方法。 4. **Java反射的应用**: - **获取类信息**:通过Class类获取类的完整结构,包括类名、属性、方法、构造器等。 - **...
field.set(userForm, Integer.parseInt(value.toString())); } // 其他类型转换... } } ``` 在这个例子中,我们遍历了请求的所有参数,然后根据参数名找到UserForm类中的对应字段,并将值设置进去。通过这种...
5. `Object`类:所有Java类的基类,包含了一些通用方法,如`equals()`、`hashCode()`和`toString()`。 三、Java反射的应用: 通过反射,Java程序可以实现以下功能: 1. 动态创建对象:在运行时根据类名创建对象,...
### Java 高级特性详解 #### 一、`hashCode` ...正确地重写 `equals` 和 `hashCode` 方法、使用 `Comparator` 进行排序、利用反射机制和序列化技术,以及实现 `clone` 方法都是开发高质量 Java 应用程序的重要技能。
这表明`String`类具有`equals`、`toString`和`hashCode`等方法,它们的参数类型和返回类型也被一一列出。 测试类`TestClassUtil`中,我们分别传入了一个`String`对象和一个`Integer`对象来调用`printClassMessage`...
- **`equals(Object other)`**:当指定对象等于此枚举常量时,返回`true`。 - **`getDeclaringClass()`**:返回与此枚举常量的枚举类型相对应的`Class`对象。 - **`hashCode()`**:返回枚举常量的哈希码。 - **`name...
Java中有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode、equals、clone、toString、getClass等。其中getClass返回一个Class 对象。Class对象十分特殊。他是...
public boolean equals(java.lang.Object arg0) public java.lang.String toString() public native int hashCode() public final native java.lang.Class getClass() public final native void notify() public ...
"".equals(o.toString())) { Log.i("xbh", o.toString()); } } } 输出结果: 12-17 12:09:33.429 29677-29677/com.example.wechat I/xbh: 徐风来 12-17 12:09:33.429 29677-29677/...
String fieldType = field.getGenericType().toString(); try { Method getter = model.getClass().getMethod("get" + capitalizedFieldName); Object fieldValue = getter.invoke(model); if (fieldValue ...
Object类提供了几个核心的方法,这些方法在处理对象时非常关键,包括equals()、hashCode()、toString()、clone()、finalize()等。 1. **equals() 方法**: - 默认情况下,equals() 方法比较的是对象的引用,即检查...
JAXB2基础 JAXB2 Basics是一个项目,为提供有用的插件... ToString插件-生成无反射策略toString()方法。 可copy(...)插件-生成无反射的战略copy(...)深度复制。 可merge(...)插件-生成无反射策略merge(...)方法,以将
示例中,遍历所有字段,根据字段类型(`field.getType().equals(String.class)`或`field.getType().equals(int.class)`)来分别设置值。 5. **修改复杂类型字段**:对于复杂类型如`ArrayList`,我们同样可以通过...
- Object类提供了几个基本的方法,如`toString()`、`equals()`和`hashCode()`,这些方法在进行对象操作时经常用到。 - 在方法签名中使用Object作为参数类型,意味着可以接受任何类型的对象。 2. **Object类的常用...