java——反射与注解

news/2024/9/16 18:43:01/

文章目录

  • Java反射基础
    • 1. 概念详解
    • 2. 示例代码
  • Java反射进阶
    • 1. 框架设计
    • 2. 动态代理
    • 3. 模板方法
  • Java注解基础
    • 1. 概念
    • 2. 基本语法
    • 3. 自定义注解
    • 4. 反射获取注解信息
  • Java注解进阶
    • 1. 应用场景
    • 2. 内置注解
    • 3. 第三方注解库
    • 4. 总结
  • Java反射与注解实战
    • 1. 实战场景
    • 2. 代码实现

在这里插入图片描述

Java反射基础

了解Java反射的概念和原理,熟悉Class、Method、Field等反射API的使用方法,能够通过反射来动态地创建对象、调用方法、设置字段等。
Java反射是Java语言中非常重要的一个特性,它允许程序在运行时获取类的信息,并且可以通过反射调用类的方法、读写类的属性等。下面是Java反射基础概念和示例代码:

1. 概念详解

Java反射的核心是Class类,它代表了一个Java类的类型信息。通过Class可以获取到类的各种信息,例如类的名称、字段、方法、构造方法等。

获取Class对象的三种方式:

  • 使用对象.getClass()方法获取对象的Class对象。
  • 通过类名.class来获取指定类的Class对象。
  • 使用Class.forName(“类名”)方法获取指定类的Class对象。

2. 示例代码

以下是一个简单的Java反射示例,它演示了如何通过反射创建对象、调用方法和设置字段:

public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public void sayHello() {System.out.println("Hello, I'm " + name + ", " + age + " years old.");}
}public class ReflectionDemo {public static void main(String[] args) throws Exception {// 创建Person类的Class对象Class<Person> clazz = Person.class;// 创建Person类的实例Person person = clazz.newInstance();// 获取Person类的name字段,并设置其值Field nameField = clazz.getDeclaredField("name");nameField.setAccessible(true);nameField.set(person, "Tom");// 获取Person类的age字段,并设置其值Field ageField = clazz.getDeclaredField("age");ageField.setAccessible(true);ageField.setInt(person, 18);// 调用Person类的sayHello方法Method sayHelloMethod = clazz.getDeclaredMethod("sayHello");sayHelloMethod.invoke(person); // 输出:Hello, I'm Tom, 18 years old.}
}

在上面的示例代码中,通过Class对象获取了Person类的信息,然后使用newInstance()方法创建一个Person类的实例。接着,通过反射获取到Person类的name和age字段,并分别为它们设置了值。最后,通过反射获取到Person类的sayHello方法,并调用该方法输出一句话。

Java反射进阶

深入学习Java反射的应用场景,例如框架设计、动态代理、模板方法等;掌握Java反射中常用的技巧和注意事项,提高反射编程的效率和可维护性。
Java反射是指在运行时动态地获取一个类的信息,对类的属性和方法进行操作。它可以让我们在运行时通过字符串来调用类的方法或创建对象,而不需要提前知道该类的名称。Java反射广泛应用于框架设计、动态代理、模板方法等场景。

下面分别介绍Java反射在框架设计、动态代理、模板方法等场景中的应用,并给出常用技巧和注意事项。

1. 框架设计

在框架设计中,Java反射被广泛应用于插件机制和配置文件解析等场景。例如,Spring框架就使用了Java反射来实现依赖注入和AOP等功能。

常用技巧:

1)获取Class对象:使用Class.forName()或Object.getClass()方法获取Class对象。

2)创建对象:使用Class.newInstance()方法或Constructor.newInstance()方法创建对象。

3)调用方法:使用Method.invoke()方法调用方法。

4)读取字段:使用Field.get()方法读取字段的值。

5)修改字段:使用Field.set()方法修改字段的值。

注意事项:

1)性能问题:Java反射的性能较低,因为它需要在运行时进行类型检查和方法调用。

2)安全问题:Java反射可以访问私有成员和方法,因此可能会破坏封装性和安全性。

示例代码:

public class ReflectTest {public static void main(String[] args) throws Exception {Class<?> clazz = Class.forName("com.example.User");Object obj = clazz.newInstance();Method setNameMethod = clazz.getMethod("setName", String.class);setNameMethod.invoke(obj, "Alice");Method getNameMethod = clazz.getMethod("getName");String name = (String) getNameMethod.invoke(obj);System.out.println(name);Field ageField = clazz.getDeclaredField("age");ageField.setAccessible(true);ageField.set(obj, 18);int age = (int) ageField.get(obj);System.out.println(age);}
}

2. 动态代理

在动态代理中,Java反射被用来动态地生成代理类。代理类可以拦截目标方法的调用并进行增强或修改。

常用技巧:

1)代理类的生成:使用Proxy.newProxyInstance()方法生成代理类。

2)InvocationHandler接口的实现:通过实现InvocationHandler接口来拦截目标方法的调用并进行处理。

注意事项:

1)代理类必须实现至少一个接口。

2)动态代理只能代理接口类型的对象,无法代理普通类。

示例代码:

public interface IUserDao {void save();
}public class UserDaoImpl implements IUserDao {@Overridepublic void save() {System.out.println("Save user...");}
}public class UserDaoProxy implements InvocationHandler {private Object target;public UserDaoProxy(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Begin transaction...");Object result = method.invoke(target, args);System.out.println("Commit transaction...");return result;}
}public class ProxyTest {public static void main(String[] args) {IUserDao userDao = new UserDaoImpl();InvocationHandler handler = new UserDaoProxy(userDao);IUserDao proxy = (IUserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),handler);proxy.save(); // Begin transaction...Save user...Commit transaction...}
}

3. 模板方法

在模板方法中,Java反射被用来实现框架的扩展性。通过Java反射,我们可以动态地调用扩展类中的方法,并将其与框架中的标准方法组合起来形成一个完整的流程。

常用技巧:

1)获取方法:使用Class.getDeclaredMethod()或Class.getMethod()方法获取方法。

2)设置方法可访问性:使用Method.setAccessible()方法将方法设为可访问。

3)调用方法:使用Method.invoke()方法调用方法。

注意事项:

1)扩展类必须实现一个标准的接口或继承一个标准的抽象类,以便框架能够调用扩展类中的方法。

2)需要确保扩展类中的方法与框架中的标准方法具有相同的名称和参数列表。

示例代码:

public interface ITemplate {void execute();
}public abstract class AbstractTemplate implements ITemplate {@Overridepublic final void execute() {init();doTask();destroy();}protected void init() {System.out.println("Initialize template...");}protected abstract void doTask();protected void destroy() {System.out.println("Destroy template...");}
}public class MyTemplate extends AbstractTemplate {@Overrideprotected void doTask() {System.out.println("Do my task...");}
}public class TemplateTest {public static void main(String[] args) throws Exception {ITemplate template = new MyTemplate();Method method = template.getClass().getMethod("doTask");method.setAccessible(true);method.invoke(template); // Do my task...}
}

以上是Java反射在框架设计、动态代理和模板方法等场景中的应用,常用技巧和注意事项。希望可以帮助您深入学习Java反射。

Java注解基础

了解Java注解的概念和基本语法,学习如何自定义注解,并且通过反射来获取注解信息。
Java注解是一种元数据,它可以在代码中以声明的形式出现,但不直接参与编译和执行。Java注解可以用来提供程序中所需的任何基本信息,例如作者、版本、版权等。Java注解广泛应用于框架设计、测试驱动开发、配置文件解析等场景。

下面介绍Java注解的概念、基本语法和自定义注解,并通过反射来获取注解信息。

1. 概念

Java注解(Annotation)是一种附加在代码中的修饰符,用于在源代码中嵌入元数据。Java注解可以用来提供程序中所需的任何基本信息,例如作者、版本、版权等。Java注解可以在编译时通过工具进行处理,或者在运行时由Java虚拟机进行处理。

2. 基本语法

Java注解的基本语法如下:

@AnnotationName
public class MyClass {// ...
}

其中,@AnnotationName是注解的名称,它可以在代码中的类、方法、字段或参数上使用。注解可以带有元素,元素以名字-值对的形式存在,用逗号分隔多个元素。例如:

@AnnotationName(name = "Alice", age = 18)
public class MyClass {// ...
}

3. 自定义注解

我们可以通过Java的元注解来自定义注解。Java的元注解包括@Retention、@Target、@Inherited和@Documented。其中,@Retention用于指定注解的生命周期,@Target用于指定注解可以应用于哪些元素,@Inherited用于指定子类是否继承注解,@Documented用于指定注解是否出现在Java文档中。

示例代码:

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {String name();int age() default 18;
}

上述代码定义了一个名为MyAnnotation的注解,它有两个属性:name和age。其中,@Retention(RetentionPolicy.RUNTIME)表示该注解可以在运行时保留,@Target(ElementType.TYPE)表示该注解只能应用于类。

4. 反射获取注解信息

我们可以使用Java反射来获取注解信息。通过Class对象的getAnnotation()方法或Method对象的getAnnotation()方法可以获取指定注解的实例。然后,我们可以通过访问注解的属性来获取信息。

示例代码:

@MyAnnotation(name = "Alice", age = 18)
public class MyClass {// ...
}public class ReflectTest {public static void main(String[] args) {Class<?> clazz = MyClass.class;MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);if (annotation != null) {System.out.println(annotation.name()); // AliceSystem.out.println(annotation.age()); // 18}}
}

Java注解进阶

深入学习Java注解的应用场景,例如框架设计、代码生成、单元测试等;掌握各种内置注解和第三方注解库的使用方法,提高注解编程的效率和可维护性。
Java注解是一种元数据,在Java语言中广泛应用于框架设计、代码生成、单元测试等场景。Java提供了很多内置注解,同时也有很多第三方注解库可以使用。

下面介绍Java注解的进阶应用场景,以及各种内置注解和第三方注解库的使用方法。

1. 应用场景

1)框架设计:Java注解可以用来标记业务逻辑、数据访问对象、服务等,以便框架能够自动生成代码或配置文件。

2)代码生成:Java注解可以用来标记需要生成的类、方法、字段等信息,并根据注解生成对应的代码。

3)单元测试:Java注解可以用来标记测试方法和测试类,以便测试框架能够自动运行测试。

4)持久化:Java注解可以用来标记实体类和数据库表之间的映射关系,以便ORM框架能够自动处理持久化操作。

2. 内置注解

Java提供了很多内置注解,常用的有以下几种:

1)@Override:表示方法覆盖父类的方法。

2)@Deprecated:表示方法已经过时,建议不再使用。

3)@SuppressWarnings:表示抑制编译器警告。

4)@SafeVarargs:表示有参数数量可变的方法或构造函数是类型安全的。

5)@FunctionalInterface:表示接口是一个函数式接口。

示例代码:

public class MyClass {@Overridepublic String toString() {return "MyClass";}@Deprecatedpublic void oldMethod() { }@SuppressWarnings("unchecked")public void test() {List list = new ArrayList();list.add("Hello");}@SafeVarargspublic final <T> void print(T... args) {for (T arg : args) {System.out.print(arg);}}@FunctionalInterfaceinterface MyInterface {void doSomething();}
}

3. 第三方注解库

除了内置注解,Java还有很多第三方注解库可以使用,常用的有以下几种:

1)Lombok:可以自动生成getter、setter、toString、equals、hashCode等方法的注解库。

2)Jackson:可以实现JSON序列化和反序列化的注解库。

3)Hibernate Validator:可以实现数据校验的注解库。

4)Swagger:可以生成API文档的注解库。

示例代码:

@Data
@AllArgsConstructor
public class User {private String name;private int age;
}public class JacksonTest {public static void main(String[] args) throws IOException {ObjectMapper mapper = new ObjectMapper();User user = new User("Alice", 18);String json = mapper.writeValueAsString(user);System.out.println(json); // {"name":"Alice","age":18}User user2 = mapper.readValue(json, User.class);System.out.println(user2.getName()); // Alice}
}public class ValidatorTest {@NotNull@Size(min = 3, max = 20)private String name;@Min(18)private int age;public ValidatorTest(String name, int age) {this.name = name;this.age = age;}public static void main(String[] args) {ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();ValidatorTest test = new ValidatorTest("Alice", 16);Set<ConstraintViolation<ValidatorTest>> violations = validator.validate(test);for (ConstraintViolation<ValidatorTest> violation : violations) {System.out.println(violation.getMessage()); // must be greater than or equal to 18}}
}@RestController
public class UserController {@GetMapping("/users")@ApiOperation(value = "Get all users")public List<User> getUsers() { ... }@PostMapping("/users")@ApiOperation(value = "Create a user")public void createUser(@Valid @RequestBody User user) { ... }
}

以上是Java注解的进阶应用场景、各种内置注解和第三方注解库的使用方法。希望可以帮助您更好地理解和应用Java注解。

4. 总结

Java注解是一种元数据,在Java语言中广泛应用于框架设计、代码生成、单元测试等场景。Java提供了很多内置注解,同时也有很多第三方注解库可以使用。通过学习Java注解,我们可以提高注解编程的效率和可维护性。

示例代码:

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {String value();
}public class MyClass {@MyAnnotation("Hello")public void sayHello() { }
}public class ReflectTest {public static void main(String[] args) throws Exception {MyClass obj = new MyClass();Method method = obj.getClass().getMethod("sayHello");MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);if (annotation != null) {System.out.println(annotation.value()); // Hello}}
}

Java反射与注解实战

在实际项目中应用Java反射和注解技术,例如使用反射实现IOC容器或AOP功能,使用注解进行数据校验或权限控制等。
Java反射和注解是Java编程中非常重要的概念,可以通过反射获取类、方法、字段等信息,并且可以使用注解来标记业务逻辑、数据访问对象、服务等。下面给出一个Java反射和注解的实战代码详解。

1. 实战场景

假设我们正在开发一个简单的社交应用,需要根据用户输入的API路径动态调用对应的服务方法,并返回结果。例如,当用户输入/api/user/get时,我们需要调用UserService中的get()方法,当用户输入/api/post/add时,我们需要调用PostService中的add()方法。

2. 代码实现

首先,我们定义一个@Service注解,用于标记服务类和服务方法:

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Service {String value();
}@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Action {String value();
}

然后,我们定义两个服务类UserService和PostService,并在类上添加@Service注解,表示这是一个服务类:

@Service("user")
public class UserService {public void get() {System.out.println("Get user...");}
}@Service("post")
public class PostService {public void add() {System.out.println("Add post...");}
}

接下来,我们实现一个API调度器DispatcherServlet,它根据用户输入的API路径,调用对应的服务方法:

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;public class DispatcherServlet {private Map<String, Object> beans = new HashMap<>();public void init() throws Exception {// 扫描服务类,并创建实例ClassPathScanUtil scanner = new ClassPathScanUtil("com.example.service");for (String className : scanner.getFullyQualifiedClassNameList()) {Class<?> clazz = Class.forName(className);if (clazz.isAnnotationPresent(Service.class)) {Service service = clazz.getAnnotation(Service.class);String serviceName = service.value();Object instance = clazz.newInstance();beans.put(serviceName, instance);}}// 注册服务方法for (Object instance : beans.values()) {Class<?> clazz = instance.getClass();if (clazz.isAnnotationPresent(Service.class)) {Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {if (method.isAnnotationPresent(Action.class)) {Action action = method.getAnnotation(Action.class);String actionName = action.value();String serviceName = clazz.getAnnotation(Service.class).value();String key = "/" + serviceName + "/" + actionName;ActionHandler handler = new ActionHandler(instance, method);HandlerMapping.register(key, handler);}}}}}public void dispatch(String apiPath) throws Exception {// 调用服务方法ActionHandler handler = HandlerMapping.get(apiPath);if (handler != null) {handler.invoke();} else {System.out.println("API path not found.");}}
}

在DispatcherServlet中,我们首先扫描服务类,并创建实例;然后,遍历每个服务类的方法,如果有@Action注解,则将其注册到HandlerMapping中;最后,根据用户输入的API路径,调用对应的服务方法。

HandlerMapping是一个静态类,它保存了API路径和对应的ActionHandler。ActionHandler封装了服务类实例和服务方法,可以通过invoke()方法来调用服务方法。

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;public class HandlerMapping {private static Map<String, ActionHandler> mappings = new HashMap<>();public static void register(String key, ActionHandler handler) {mappings.put(key, handler);}public static ActionHandler get(String key) {return mappings.get(key);}
}public class ActionHandler {private Object instance;private Method method;public ActionHandler(Object instance, Method method) {this.instance = instance;this.method = method;}public void invoke() throws Exception {method.invoke(instance);}
}

最后,我们在main()方法中使用DispatcherServlet来处理API请求:

public class Main {public static void main(String[] args) throws Exception{DispatcherServlet servlet = new DispatcherServlet();servlet.init();servlet.dispatch("/user/get");servlet.dispatch("/post/add");servlet.dispatch("/comment/list");}
}

在这个例子中,我们使用Java反射和注解实现了一个简单的API调度器。通过@Service注解,我们标记了服务类;通过@Action注解,我们标记了服务方法。通过DispatcherServlet,我们扫描服务类并创建实例,然后注册服务方法到HandlerMapping中。最后,在处理API请求时,我们根据API路径获取对应的ActionHandler,并通过反射调用服务方法。


http://www.ppmy.cn/news/554956.html

相关文章

【Java 基础篇】Java 修饰符:掌握代码的灵魂之钥

文章目录 导言一、访问修饰符二、非访问修饰符1、final修饰符2、static修饰符3、abstract修饰符4、synchronized修饰符 三、修饰符的组合使用总结 导言 在Java编程中&#xff0c;修饰符是一种关键元素&#xff0c;用于控制类、方法、变量和构造函数的访问性、行为和特性。Java…

深入地下,实地探访!不用人挖煤的智能煤矿长什么样?

来源&#xff1a;脑极体 未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图谱&…

煤泥水处理方法

1.一种煤泥水处理方法&#xff0c;其特征在于&#xff1a;包括以下步骤&#xff1a; (1)、将煤炭洗选后的煤泥水通过管道输送到洗煤厂内的底流浓缩池&#xff0c;向底流浓缩池内加入絮凝剂将煤泥水浓缩&#xff0c;使得煤泥水中的含固量达到300&#xff5e;400g/L; (2)、将浓缩…

浅谈智慧矿山之智慧矿山建设的目的

自从王国法院士向国家提出智慧矿山建设的时间规划之后&#xff0c;在煤矿系统的圈子里&#xff0c;大家交流最多的就是智能化、智慧化&#xff0c;谁都可以讲几句&#xff0c;说点东西出来。但是我们为什么要建设智慧矿山呢&#xff1f;很多人也在问&#xff0c;很多回答都是见…

搞IT就像挖煤一样

从19世纪70年代开始&#xff0c;一直到20世纪30年代的大萧条时期&#xff0c;煤矿工人都在忍受着雇主们的剥削。煤炭公司极大地剥削工人以获取最大利益&#xff1a;工作环境复杂多变&#xff0c;有些地方简陋不堪甚至极度危险。工资由工人从矿场里开采出的煤炭重量决定&#xf…

挖空的煤矿能否储存石油

挖空的煤矿能否储存石油 红朝儒生 2016-9-3 关键字&#xff1a;煤矿 存储 石油 简介&#xff1a;挖空的煤矿&#xff0c;会形成塌陷区&#xff0c;带来各种灾害和破坏。能不能利用起来存储石油&#xff1f; 中国是个煤矿大国&#xff0c;从改开以来大量开采&#xff0c;包括取…

一次挖矿入侵处理记录(2021.01.27)

https://github.com/bg6cq/ITTS/blob/master/security/mine/README.md 转自上面链接&#xff0c;也是我的亲身经历&#xff0c;供大家学习。网络安全大家引以为戒。爱闹的小兄弟们&#xff0c;别闹了啊&#xff0c;让张老师花了好几天的心思在你们弄得事情上。 [原创]一次挖矿…

简单聊聊煤炭行业的数字化和可持续发展

煤在普通人的心目中是一种能引起复杂感情的东西。我们喜欢它在冬天给我们带来温暖&#xff0c;我们不喜欢它因为它黢黑黢黑的&#xff0c;沾在身上特别黑&#xff0c;看起来脏兮兮的。在笔者的记忆中&#xff0c;小时候煤可是生活的必需品。 小时候在冬天的河北必须要生炉子&a…

挖煤(coal)

挖煤&#xff08;coal&#xff09; solution 我好弱&#xff0c;啥也想不到。 想了很久dp&#xff0c;这有后效性啊。 结果倒着做就可以了&#xff0c;因为后面的不会影响前面的。 考虑前面的影响后面&#xff1a;挖煤相当于让后面所有a[I]*(1k%) #include<cstdio> …

我的一些实战的漏洞挖掘过程(一)

最近挖到的漏洞&#xff0c;在这里分享一下&#xff0c;有些信息比较敏感就打码处理&#xff0c;目标网站都换为target.com 反射xss漏洞挖掘 跨站脚本攻击&#xff08;Cross-site Scripting&#xff0c;XSS&#xff09;是一种常见的Web安全漏洞&#xff0c;攻击者通过在Web应…

甘肃非煤矿山电子封条 智慧矿山 opencv

甘肃非煤矿山电子封条 智慧煤矿接入国家矿山安全平台是通过pythonopencv网络模型&#xff0c;甘肃非煤矿山电子封条pythonopencv网络模型对关键位置&#xff08;回风井口、运人井口、车辆出入口&#xff09;对现场人员行为、数量、穿戴着装及设备状态各数据进行实时监控分析。p…

关于漏洞挖掘

漏洞挖掘 各平台提交规则 1. CNVD&#xff1a;有归属的一般都收&#xff0c;没有实质性危害的不收 2. 补天&#xff1a;百度权重或者移动权重大于等于才可以收录&#xff08;满足两者一点就行&#xff09; 3. 漏洞盒子&#xff1a;门槛比较低&#xff0c;一般有明确归属感就收…

选矿选煤知识介绍

中国是世界上疆域辽阔、成矿地质条件优越、矿种齐全配套、资源总量丰富的国家&#xff0c;是具有自己资源特色的一个矿产资源大国。 中国矿业资源的主要特点&#xff1a;我国矿产资源既有优势&#xff0c;也有劣势。优劣并存的基本态势主要表现在以下几个方面&#xff1a; 1、…

过去挖煤,现在挖什么?李彦宏的家乡正在发生这些变化

如今数据已经成为信息时代的基础支撑&#xff0c;是各个行业不可或缺的重要能源。而作为传统煤炭资源大省&#xff0c;山西为了彻底摆脱对煤炭产业的过度依赖&#xff0c;在国家相关政策支持下正在发生着重大变化&#xff0c;大数据产业正在成为山西省转型的重要支点&#xff0…

太阳上挖煤的可行性报告

随着我们伟大祖国建设的飞速发展&#xff0c;能源问题日益突出&#xff0c;要发展&#xff0c;我们就要开发新的能量来源&#xff0c;在此&#xff0c;我郑重提出&#xff1a;向太阳进军&#xff01;向太阳要能源&#xff01;在太阳上挖煤&#xff01;  本报告分三个部分&…

5G下矿井,煤炭行业进入“智”时代

煤炭行业是我国重要的传统能源行业&#xff0c;其发展建设直接关系我国国民经济和社会智能化进程。作为典型的劳动力密集产业&#xff0c;煤炭行业用工成本逐年攀升&#xff0c;安全问题日益突出&#xff0c;智能化、安全化、无人化操作成为了每一个煤矿业人的期盼。 ▼ 当前…

开辟预言机噺思路|挖ADAMoracle矿商的珍馐美馔

开辟预言机噺思路|挖ADAMoracle矿商的珍馐美馔 DeFi 是过去一年整个区块链世界发展最为迅速的领域&#xff0c;且呈现出成熟稳步增长的态势&#xff0c;预言机作为其中的中间件&#xff0c;发挥着重要作用。它对内承载了智能合约的数据的流转和使用&#xff0c;对外打破了链下…

Android手机root刷机教程:三星I9003手机如何快速获取ROOT权限,小三们不会ROOT的请看过来,手把手图文教程帮你ROOT手机

上次我写了一篇文章&#xff0c; “ google play电子市场和gmail如何安装在国产手机、三星手机、摩托手机里” 大家好多人找到我&#xff0c;问手机如何ROOT的&#xff0c;当然了三星用户居多&#xff0c;我的手机就是三星I9003&#xff0c;版本信息如下&#xff1a; 下面&…

华为下矿不挖煤,鸿蒙搭台不唱戏

关注ITValue&#xff0c;看企业级最新鲜、最价值报道&#xff01; 在华为成立至今34年的历史上&#xff0c;第一次出现了煤矿军团这个组织&#xff0c;邹志磊何许人也&#xff0c;任正非又为何把煤矿军团交由他来管理&#xff1f; 邹志磊1998年加入华为&#xff0c;常年从事国内…

三星I9000挖煤模式和R模式进入方法

進入刷機DOWNLOADING挖煤模式&#xff1a; 第一先按HOME鍵&#xff0c;按住不放&#xff0c;然後再按音量向下&#xff0c;繼續按住不放&#xff0c;最後按電源&#xff0c;當看到samsung Galaxy S GT-I9000的畫面&#xff0c;鬆手。搞定&#xff0c;接下來你看到機器人在挖土了…